void drawtiles(Map m, unsigned char *buf, Sensor s, mapVec pos, mapVec size) { int index=0; unsigned char tileIndex; unsigned char flags; int drawX, drawY; Volume vol = sensor_volume(s); mapVec borig, bsz; volume_swept_bounds(vol, &borig, &bsz); mapVec msz = map_size(m); float ystart = CLIP(pos.y, 0, msz.y); float xstart = CLIP(pos.x, 0, msz.x); float yend = CLIP(pos.y+size.y, 0, msz.y); float xend = CLIP(pos.x+size.x, 0, msz.x); int z = CLIP(pos.z, 0, msz.z); //note: different from test.c version for(int y = ystart; y < yend; y++) { for(int x = xstart; x < xend; x++) { index = tile_index(x, y, z, msz, borig, bsz); flags = buf[index]; TCOD_console_print_left(NULL, 0, 18, TCOD_BKGND_NONE, "%i, %i, %i", map_item_lit(flags), map_item_in_volume(flags), map_item_los(flags)); tileIndex = map_tile_at(m, x, y, z); drawX = x*2+z*((msz.x*2)+1); drawY = y; //TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, "%i", index); if(map_item_visible(flags)) { //visible and lit and in volume TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, "%i", tileIndex); } // else if(!map_item_lit(flags) && map_item_in_volume(flags) && map_item_los(flags)) { // //not lit and viewable // TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, "_"); // } // else if(!map_item_lit(flags) && map_item_in_volume(flags) && !map_item_los(flags)) { // //not lit and not los // TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, ","); // } // else if(!map_item_lit(flags) && !map_item_in_volume(flags) && map_item_los(flags)) { // //not lit and not in vol // TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, "d"); // } // else if(map_item_lit(flags) && !map_item_in_volume(flags) && map_item_los(flags)) { // //lit and in los, but not in vol // TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, "a"); // } // else if(map_item_lit(flags) && map_item_in_volume(flags) && !map_item_los(flags)) { // //lit and in vol, but not in los // TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, "b"); // } // else if(map_item_lit(flags) && !map_item_in_volume(flags) && !map_item_los(flags)) { // //lit and not in vol or los (or los wasn't checked) // TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, "."); // } // else if(!map_item_lit(flags) && !map_item_in_volume(flags) && !map_item_los(flags)) { // //not lit, in vol, or in los // TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, "x"); // } } } }
void draw_object(Stimulus st) { unsigned char visflags = stimulus_obj_sight_change_get_new_flags(st); mapVec pos = stimulus_obj_sight_change_get_position(st); char *id = stimulus_obj_sight_change_get_id(st); if(!map_item_visible(visflags)) { TCOD_console_print_left(NULL, pos.x*2, pos.y, TCOD_BKGND_NONE, "X"); } else { TCOD_console_print_left(NULL, pos.x*2, pos.y, TCOD_BKGND_NONE, id); } }
void sensor_push_stimulus(Sensor s, Stimulus stim) { mapVec pt, sz; perception *newVis; perception *snewVis = s->vistiles; perception newPerception; bool litAndVisible; Object o; Map m = s->map; mapVec borig=s->borig, bsz=s->bsz; switch(stimulus_type(stim)) { case StimTileLitChange: case StimTileVisChange: newVis = stimulus_tile_sight_change_get_new_perceptmap(stim); pt = stimulus_tile_sight_change_get_position(stim); sz = stimulus_tile_sight_change_get_size(stim); for(int z = pt.z; z < pt.z+sz.z; z++) { for(int y = pt.y; y < pt.y+sz.y; y++) { for(int x = pt.x; x < pt.x+sz.x; x++) { int stimIndex = tile_index(x, y, z, map_size(m), pt, sz); int visIndex = tile_index(x, y, z, map_size(m), borig, bsz); snewVis[visIndex] = newVis[stimIndex]; } } } break; case StimObjLitChange: case StimObjVisChange: case StimObjMoved: //is the object in newVis? if so, put it into oldVis; if not, make sure it isn't in oldVis. //do this search by _ID_, not by identity //are the new flags good? if so, be sure the object is in vis. otherwise, be sure it's not in vis. if(sensor_visobjs_contains(s->visObjects, o)) { sensor_visobjs_push(s->oldVisObjects, o); } else { sensor_visobjs_remove(s->oldVisObjects, o); } newPerception = stimulus_obj_sight_change_get_new_perception(stim); litAndVisible = map_item_visible(newPerception); if(litAndVisible) { if(!sensor_visobjs_contains(s->visObjects, o)) { sensor_visobjs_push(s->visObjects, o); } } else { if(sensor_visobjs_contains(s->visObjects, o)) { sensor_visobjs_remove(s->visObjects, o); } } break; case StimGeneric: default: break; } TCOD_list_push(s->stimuli, stim); }