long instf_attack_room_slab(struct Thing *creatng, long *param) { TRACE_THING(creatng); //return _DK_instf_attack_room_slab(creatng, param); struct Room *room; room = get_room_thing_is_on(creatng); if (room_is_invalid(room)) { ERRORLOG("The %s is not on room",thing_model_name(creatng)); return 0; } struct SlabMap *slb; slb = get_slabmap_thing_is_on(creatng); if (slb->health > 2) { //TODO CONFIG damage made to room slabs is constant - doesn't look good slb->health -= 2; thing_play_sample(creatng, 128 + UNSYNC_RANDOM(3), NORMAL_PITCH, 0, 3, 0, 2, FULL_LOUDNESS); return 1; } if (room->owner != game.neutral_player_num) { struct Dungeon *dungeon; dungeon = get_dungeon(room->owner); dungeon->rooms_destroyed++; } if (!delete_room_slab(coord_slab(creatng->mappos.x.val), coord_slab(creatng->mappos.y.val), 1)) { ERRORLOG("Cannot delete %s room tile destroyed by %s",room_code_name(room->kind),thing_model_name(creatng)); return 0; } create_effect(&creatng->mappos, 3, creatng->owner); thing_play_sample(creatng, 47, NORMAL_PITCH, 0, 3, 0, 2, FULL_LOUDNESS); return 1; }
TngUpdateRet update_trap_trigger(struct Thing *traptng) { if (traptng->trap.num_shots <= 0) { return TUFRet_Unchanged; } TbBool do_trig; switch (trap_stats[traptng->model].trigger_type) { case 1: do_trig = update_trap_trigger_line_of_sight_90(traptng); break; case 2: do_trig = update_trap_trigger_pressure(traptng); break; default: ERRORLOG("Illegal trap trigger type %d",(int)trap_stats[traptng->model].trigger_type); do_trig = false; break; } if (do_trig) { const struct ManfctrConfig *mconf; mconf = &game.traps_config[traptng->model]; traptng->trap.long_14t = game.play_gameturn + mconf->shots_delay; int n; n = traptng->trap.num_shots; if ((n > 0) && (n != 255)) { traptng->trap.num_shots = n - 1; if (traptng->trap.num_shots == 0) { // If the trap is in strange location, destroy it after it's depleted struct SlabMap *slb; slb = get_slabmap_thing_is_on(traptng); if ((slb->kind != SlbT_CLAIMED) && (slb->kind != SlbT_PATH)) { traptng->health = -1; } traptng->field_4F &= 0x10; traptng->field_4F |= 0x20; if (!is_neutral_thing(traptng) && !is_hero_thing(traptng)) { remove_workshop_item_from_amount_placeable(traptng->owner, traptng->class_id, traptng->model); } } } return TUFRet_Modified; } return TUFRet_Unchanged; }