void trap::load( JsonObject &jo ) { std::unique_ptr<trap> trap_ptr( new trap() ); trap &t = *trap_ptr; if( jo.has_member( "drops" ) ) { JsonArray drops_list = jo.get_array( "drops" ); while( drops_list.has_more() ) { t.components.push_back( drops_list.next_string() ); } } t.name = jo.get_string( "name" ); if( !t.name.empty() ) { t.name = _( t.name.c_str() ); } t.id = trap_str_id( jo.get_string( "id" ) ); t.loadid = trap_id( traplist.size() ); t.color = color_from_string( jo.get_string( "color" ) ); t.sym = jo.get_string( "symbol" ).at( 0 ); t.visibility = jo.get_int( "visibility" ); t.avoidance = jo.get_int( "avoidance" ); t.difficulty = jo.get_int( "difficulty" ); t.act = trap_function_from_string( jo.get_string( "action" ) ); t.benign = jo.get_bool( "benign", false ); t.funnel_radius_mm = jo.get_int( "funnel_radius", 0 ); t.trigger_weight = jo.get_int( "trigger_weight", -1 ); trapmap[t.id] = t.loadid; traplist.push_back( &t ); trap_ptr.release(); if( t.is_funnel() ) { funnel_traps.push_back( &t ); } }
void trap::on_disarmed( map &m, const tripoint &p ) const { for( auto &i : components ) { m.spawn_item( p.x, p.y, i, 1, 1 ); } // TODO: make this a flag, or include it into the components. if( id == trap_str_id( "tr_shotgun_1" ) || id == trap_str_id( "tr_shotgun_2" ) ) { m.spawn_item( p.x, p.y, "shot_00", 1, 2 ); } if( is_3x3_trap() ) { for( int i = -1; i <= 1; i++ ) { for( int j = -1; j <= 1; j++ ) { m.remove_trap( tripoint( p.x + i, p.y + j, p.z ) ); } } } else { m.remove_trap( p ); } }
void trap::finalize() { for( const trap &t_const : trap_factory.get_all() ) { trap &t = const_cast<trap &>( t_const ); // We need to set int ids manually now t.loadid = t.id.id(); if( t.is_funnel() ) { funnel_traps.push_back( &t ); } } const auto trapfind = []( const char *id ) { return trap_str_id( id ).id(); }; tr_null = trap_str_id::NULL_ID().id(); tr_bubblewrap = trapfind( "tr_bubblewrap" ); tr_cot = trapfind( "tr_cot" ); tr_funnel = trapfind( "tr_funnel" ); tr_metal_funnel = trapfind( "tr_metal_funnel" ); tr_makeshift_funnel = trapfind( "tr_makeshift_funnel" ); tr_leather_funnel = trapfind( "tr_leather_funnel" ); tr_rollmat = trapfind( "tr_rollmat" ); tr_fur_rollmat = trapfind( "tr_fur_rollmat" ); tr_beartrap = trapfind( "tr_beartrap" ); tr_beartrap_buried = trapfind( "tr_beartrap_buried" ); tr_nailboard = trapfind( "tr_nailboard" ); tr_caltrops = trapfind( "tr_caltrops" ); tr_tripwire = trapfind( "tr_tripwire" ); tr_crossbow = trapfind( "tr_crossbow" ); tr_shotgun_2 = trapfind( "tr_shotgun_2" ); tr_shotgun_1 = trapfind( "tr_shotgun_1" ); tr_engine = trapfind( "tr_engine" ); tr_blade = trapfind( "tr_blade" ); tr_landmine = trapfind( "tr_landmine" ); tr_landmine_buried = trapfind( "tr_landmine_buried" ); tr_telepad = trapfind( "tr_telepad" ); tr_goo = trapfind( "tr_goo" ); tr_dissector = trapfind( "tr_dissector" ); tr_sinkhole = trapfind( "tr_sinkhole" ); tr_pit = trapfind( "tr_pit" ); tr_spike_pit = trapfind( "tr_spike_pit" ); tr_lava = trapfind( "tr_lava" ); tr_portal = trapfind( "tr_portal" ); tr_ledge = trapfind( "tr_ledge" ); tr_boobytrap = trapfind( "tr_boobytrap" ); tr_temple_flood = trapfind( "tr_temple_flood" ); tr_temple_toggle = trapfind( "tr_temple_toggle" ); tr_glow = trapfind( "tr_glow" ); tr_hum = trapfind( "tr_hum" ); tr_shadow = trapfind( "tr_shadow" ); tr_drain = trapfind( "tr_drain" ); tr_snake = trapfind( "tr_snake" ); tr_glass_pit = trapfind( "tr_glass_pit" ); }
void trap::finalize() { for( auto & tptr : traplist ) { if( tptr->is_funnel() ) { funnel_traps.push_back( tptr.get() ); } } const auto trapfind = []( const char *id ) { return trap_str_id( id ).id(); }; tr_null = trap_str_id::NULL_ID.id(); tr_bubblewrap = trapfind("tr_bubblewrap"); tr_cot = trapfind("tr_cot"); tr_brazier = trapfind("tr_brazier"); tr_funnel = trapfind("tr_funnel"); tr_makeshift_funnel = trapfind("tr_makeshift_funnel"); tr_leather_funnel = trapfind("tr_leather_funnel"); tr_rollmat = trapfind("tr_rollmat"); tr_fur_rollmat = trapfind("tr_fur_rollmat"); tr_beartrap = trapfind("tr_beartrap"); tr_beartrap_buried = trapfind("tr_beartrap_buried"); tr_nailboard = trapfind("tr_nailboard"); tr_caltrops = trapfind("tr_caltrops"); tr_tripwire = trapfind("tr_tripwire"); tr_crossbow = trapfind("tr_crossbow"); tr_shotgun_2 = trapfind("tr_shotgun_2"); tr_shotgun_1 = trapfind("tr_shotgun_1"); tr_engine = trapfind("tr_engine"); tr_blade = trapfind("tr_blade"); tr_light_snare = trapfind("tr_light_snare"); tr_heavy_snare = trapfind("tr_heavy_snare"); tr_landmine = trapfind("tr_landmine"); tr_landmine_buried = trapfind("tr_landmine_buried"); tr_telepad = trapfind("tr_telepad"); tr_goo = trapfind("tr_goo"); tr_dissector = trapfind("tr_dissector"); tr_sinkhole = trapfind("tr_sinkhole"); tr_pit = trapfind("tr_pit"); tr_spike_pit = trapfind("tr_spike_pit"); tr_lava = trapfind("tr_lava"); tr_portal = trapfind("tr_portal"); tr_ledge = trapfind("tr_ledge"); tr_boobytrap = trapfind("tr_boobytrap"); tr_temple_flood = trapfind("tr_temple_flood"); tr_temple_toggle = trapfind("tr_temple_toggle"); tr_glow = trapfind("tr_glow"); tr_hum = trapfind("tr_hum"); tr_shadow = trapfind("tr_shadow"); tr_drain = trapfind("tr_drain"); tr_snake = trapfind("tr_snake"); tr_glass_pit = trapfind("tr_glass_pit"); }
void tutorial_game::post_action( action_id act ) { switch( act ) { case ACTION_RELOAD: if( g->u.weapon.is_gun() && !tutorials_seen[LESSON_GUN_FIRE] ) { g->summon_mon( mon_zombie, tripoint( g->u.posx(), g->u.posy() - 6, g->u.posz() ) ); g->summon_mon( mon_zombie, tripoint( g->u.posx() + 2, g->u.posy() - 5, g->u.posz() ) ); g->summon_mon( mon_zombie, tripoint( g->u.posx() - 2, g->u.posy() - 5, g->u.posz() ) ); add_message( LESSON_GUN_FIRE ); } break; case ACTION_OPEN: add_message( LESSON_CLOSE ); break; case ACTION_CLOSE: add_message( LESSON_SMASH ); break; case ACTION_USE: if( g->u.has_amount( "grenade_act", 1 ) ) { add_message( LESSON_ACT_GRENADE ); } for( int x = g->u.posx() - 1; x <= g->u.posx() + 1; x++ ) { for( int y = g->u.posy() - 1; y <= g->u.posy() + 1; y++ ) { if( g->m.tr_at( {x, y, g->u.posz()} ).id == trap_str_id( "tr_bubblewrap" ) ) add_message( LESSON_ACT_BUBBLEWRAP ); } } break; case ACTION_EAT: if( g->u.last_item == "codeine" ) { add_message( LESSON_TOOK_PAINKILLER ); } else if( g->u.last_item == "cig" ) { add_message( LESSON_TOOK_CIG ); } else if( g->u.last_item == "water" ) { add_message( LESSON_DRANK_WATER ); } break; case ACTION_WEAR: { item it( g->u.last_item, 0 ); if( it.is_armor() ) { if( it.get_coverage() >= 2 || it.get_thickness() >= 2 ) { add_message( LESSON_WORE_ARMOR ); } if( it.get_storage() >= units::from_liter( 5 ) ) { add_message( LESSON_WORE_STORAGE ); } if( it.get_env_resist() >= 2 ) { add_message( LESSON_WORE_MASK ); } } } break; case ACTION_WIELD: if( g->u.weapon.is_gun() ) { add_message( LESSON_GUN_LOAD ); } break; case ACTION_EXAMINE: add_message( LESSON_INTERACT ); /* fallthrough */ case ACTION_PICKUP: { item it( g->u.last_item, 0 ); if( it.is_armor() ) { add_message( LESSON_GOT_ARMOR ); } else if( it.is_gun() ) { add_message( LESSON_GOT_GUN ); } else if( it.is_ammo() ) { add_message( LESSON_GOT_AMMO ); } else if( it.is_tool() ) { add_message( LESSON_GOT_TOOL ); } else if( it.is_food() ) { add_message( LESSON_GOT_FOOD ); } else if( it.is_melee() ) { add_message( LESSON_GOT_WEAPON ); } } break; default: //TODO: add more actions here break; } }
void set_ter_ids() { t_null = ter_id( "t_null" ); t_hole = ter_id( "t_hole" ); t_dirt = ter_id( "t_dirt" ); t_sand = ter_id( "t_sand" ); t_clay = ter_id( "t_clay" ); t_dirtmound = ter_id( "t_dirtmound" ); t_pit_shallow = ter_id( "t_pit_shallow" ); t_pit = ter_id( "t_pit" ); t_pit_corpsed = ter_id( "t_pit_corpsed" ); t_pit_covered = ter_id( "t_pit_covered" ); t_pit_spiked = ter_id( "t_pit_spiked" ); t_pit_spiked_covered = ter_id( "t_pit_spiked_covered" ); t_pit_glass = ter_id( "t_pit_glass" ); t_pit_glass_covered = ter_id( "t_pit_glass_covered" ); t_rock_floor = ter_id( "t_rock_floor" ); t_grass = ter_id( "t_grass" ); t_metal_floor = ter_id( "t_metal_floor" ); t_pavement = ter_id( "t_pavement" ); t_pavement_y = ter_id( "t_pavement_y" ); t_sidewalk = ter_id( "t_sidewalk" ); t_concrete = ter_id( "t_concrete" ); t_thconc_floor = ter_id( "t_thconc_floor" ); t_thconc_floor_olight = ter_id( "t_thconc_floor_olight" ); t_strconc_floor = ter_id( "t_strconc_floor" ); t_floor = ter_id( "t_floor" ); t_floor_waxed = ter_id( "t_floor_waxed" ); t_dirtfloor = ter_id( "t_dirtfloor" ); t_carpet_red = ter_id( "t_carpet_red" ); t_carpet_yellow = ter_id( "t_carpet_yellow" ); t_carpet_purple = ter_id( "t_carpet_purple" ); t_carpet_green = ter_id( "t_carpet_green" ); t_linoleum_white = ter_id( "t_linoleum_white" ); t_linoleum_gray = ter_id( "t_linoleum_gray" ); t_grate = ter_id( "t_grate" ); t_slime = ter_id( "t_slime" ); t_bridge = ter_id( "t_bridge" ); t_utility_light = ter_id( "t_utility_light" ); t_wall_log_half = ter_id( "t_wall_log_half" ); t_wall_log = ter_id( "t_wall_log" ); t_wall_log_chipped = ter_id( "t_wall_log_chipped" ); t_wall_log_broken = ter_id( "t_wall_log_broken" ); t_palisade = ter_id( "t_palisade" ); t_palisade_gate = ter_id( "t_palisade_gate" ); t_palisade_gate_o = ter_id( "t_palisade_gate_o" ); t_wall_half = ter_id( "t_wall_half" ); t_wall_wood = ter_id( "t_wall_wood" ); t_wall_wood_chipped = ter_id( "t_wall_wood_chipped" ); t_wall_wood_broken = ter_id( "t_wall_wood_broken" ); t_wall = ter_id( "t_wall" ); t_concrete_wall = ter_id( "t_concrete_wall" ); t_brick_wall = ter_id( "t_brick_wall" ); t_wall_metal = ter_id( "t_wall_metal" ); t_wall_glass = ter_id( "t_wall_glass" ); t_wall_glass_alarm = ter_id( "t_wall_glass_alarm" ); t_reinforced_glass = ter_id( "t_reinforced_glass" ); t_reinforced_door_glass_c = ter_id( "t_reinforced_door_glass_c" ); t_reinforced_door_glass_o = ter_id( "t_reinforced_door_glass_o" ); t_bars = ter_id( "t_bars" ); t_reb_cage = ter_id( "t_reb_cage" ); t_wall_b = ter_id( "t_wall_b" ); t_wall_g = ter_id( "t_wall_g" ); t_wall_p = ter_id( "t_wall_p" ); t_wall_r = ter_id( "t_wall_r" ); t_wall_w = ter_id( "t_wall_w" ); t_door_c = ter_id( "t_door_c" ); t_door_c_peep = ter_id( "t_door_c_peep" ); t_door_b = ter_id( "t_door_b" ); t_door_b_peep = ter_id( "t_door_b_peep" ); t_door_o = ter_id( "t_door_o" ); t_door_o_peep = ter_id( "t_door_o_peep" ); t_rdoor_c = ter_id( "t_rdoor_c" ); t_rdoor_b = ter_id( "t_rdoor_b" ); t_rdoor_o = ter_id( "t_rdoor_o" ); t_door_locked_interior = ter_id( "t_door_locked_interior" ); t_door_locked = ter_id( "t_door_locked" ); t_door_locked_peep = ter_id( "t_door_locked_peep" ); t_door_locked_alarm = ter_id( "t_door_locked_alarm" ); t_door_frame = ter_id( "t_door_frame" ); t_mdoor_frame = ter_id( "t_mdoor_frame" ); t_chaingate_l = ter_id( "t_chaingate_l" ); t_fencegate_c = ter_id( "t_fencegate_c" ); t_fencegate_o = ter_id( "t_fencegate_o" ); t_chaingate_c = ter_id( "t_chaingate_c" ); t_chaingate_o = ter_id( "t_chaingate_o" ); t_door_boarded = ter_id( "t_door_boarded" ); t_door_boarded_damaged = ter_id( "t_door_boarded_damaged" ); t_door_boarded_peep = ter_id( "t_door_boarded_peep" ); t_rdoor_boarded = ter_id( "t_rdoor_boarded" ); t_rdoor_boarded_damaged = ter_id( "t_rdoor_boarded_damaged" ); t_door_boarded_damaged_peep = ter_id( "t_door_boarded_damaged_peep" ); t_door_metal_c = ter_id( "t_door_metal_c" ); t_door_metal_o = ter_id( "t_door_metal_o" ); t_door_metal_locked = ter_id( "t_door_metal_locked" ); t_door_metal_pickable = ter_id( "t_door_metal_pickable" ); t_door_bar_c = ter_id( "t_door_bar_c" ); t_door_bar_o = ter_id( "t_door_bar_o" ); t_door_bar_locked = ter_id( "t_door_bar_locked" ); t_door_glass_c = ter_id( "t_door_glass_c" ); t_door_glass_o = ter_id( "t_door_glass_o" ); t_door_glass_frosted_c = ter_id( "t_door_glass_frosted_c" ); t_door_glass_frosted_o = ter_id( "t_door_glass_frosted_o" ); t_portcullis = ter_id( "t_portcullis" ); t_recycler = ter_id( "t_recycler" ); t_window = ter_id( "t_window" ); t_window_taped = ter_id( "t_window_taped" ); t_window_domestic = ter_id( "t_window_domestic" ); t_window_domestic_taped = ter_id( "t_window_domestic_taped" ); t_window_open = ter_id( "t_window_open" ); t_curtains = ter_id( "t_curtains" ); t_window_alarm = ter_id( "t_window_alarm" ); t_window_alarm_taped = ter_id( "t_window_alarm_taped" ); t_window_empty = ter_id( "t_window_empty" ); t_window_frame = ter_id( "t_window_frame" ); t_window_boarded = ter_id( "t_window_boarded" ); t_window_boarded_noglass = ter_id( "t_window_boarded_noglass" ); t_window_reinforced = ter_id( "t_window_reinforced" ); t_window_reinforced_noglass = ter_id( "t_window_reinforced_noglass" ); t_window_enhanced = ter_id( "t_window_enhanced" ); t_window_enhanced_noglass = ter_id( "t_window_enhanced_noglass" ); t_window_bars_alarm = ter_id( "t_window_bars_alarm" ); t_window_bars = ter_id( "t_window_bars" ); t_window_stained_green = ter_id( "t_window_stained_green" ); t_window_stained_red = ter_id( "t_window_stained_red" ); t_window_stained_blue = ter_id( "t_window_stained_blue" ); t_window_no_curtains = ter_id( "t_window_no_curtains" ); t_window_no_curtains_open = ter_id( "t_window_no_curtains_open" ); t_window_no_curtains_taped = ter_id( "t_window_no_curtains_taped" ); t_rock = ter_id( "t_rock" ); t_fault = ter_id( "t_fault" ); t_paper = ter_id( "t_paper" ); t_rock_wall = ter_id( "t_rock_wall" ); t_rock_wall_half = ter_id( "t_rock_wall_half" ); t_tree = ter_id( "t_tree" ); t_tree_young = ter_id( "t_tree_young" ); t_tree_apple = ter_id( "t_tree_apple" ); t_tree_apple_harvested = ter_id( "t_tree_apple_harvested" ); t_tree_coffee = ter_id( "t_tree_coffee" ); t_tree_coffee_harvested = ter_id( "t_tree_coffee_harvested" ); t_tree_pear = ter_id( "t_tree_pear" ); t_tree_pear_harvested = ter_id( "t_tree_pear_harvested" ); t_tree_cherry = ter_id( "t_tree_cherry" ); t_tree_cherry_harvested = ter_id( "t_tree_cherry_harvested" ); t_tree_peach = ter_id( "t_tree_peach" ); t_tree_peach_harvested = ter_id( "t_tree_peach_harvested" ); t_tree_apricot = ter_id( "t_tree_apricot" ); t_tree_apricot_harvested = ter_id( "t_tree_apricot_harvested" ); t_tree_plum = ter_id( "t_tree_plum" ); t_tree_plum_harvested = ter_id( "t_tree_plum_harvested" ); t_tree_pine = ter_id( "t_tree_pine" ); t_tree_blackjack = ter_id( "t_tree_blackjack" ); t_tree_birch = ter_id( "t_tree_birch" ); t_tree_willow = ter_id( "t_tree_willow" ); t_tree_maple = ter_id( "t_tree_maple" ); t_tree_maple_tapped = ter_id( "t_tree_maple_tapped" ); t_tree_deadpine = ter_id( "t_tree_deadpine" ); t_tree_hickory = ter_id( "t_tree_hickory" ); t_tree_hickory_dead = ter_id( "t_tree_hickory_dead" ); t_tree_hickory_harvested = ter_id( "t_tree_hickory_harvested" ); t_underbrush = ter_id( "t_underbrush" ); t_shrub = ter_id( "t_shrub" ); t_shrub_blueberry = ter_id( "t_shrub_blueberry" ); t_shrub_strawberry = ter_id( "t_shrub_strawberry" ); t_trunk = ter_id( "t_trunk" ); t_stump = ter_id( "t_stump" ); t_root_wall = ter_id( "t_root_wall" ); t_wax = ter_id( "t_wax" ); t_floor_wax = ter_id( "t_floor_wax" ); t_fence = ter_id( "t_fence" ); t_chainfence = ter_id( "t_chainfence" ); t_chainfence_posts = ter_id( "t_chainfence_posts" ); t_fence_post = ter_id( "t_fence_post" ); t_fence_wire = ter_id( "t_fence_wire" ); t_fence_barbed = ter_id( "t_fence_barbed" ); t_fence_rope = ter_id( "t_fence_rope" ); t_railing = ter_id( "t_railing" ); t_marloss = ter_id( "t_marloss" ); t_fungus_floor_in = ter_id( "t_fungus_floor_in" ); t_fungus_floor_sup = ter_id( "t_fungus_floor_sup" ); t_fungus_floor_out = ter_id( "t_fungus_floor_out" ); t_fungus_wall = ter_id( "t_fungus_wall" ); t_fungus_mound = ter_id( "t_fungus_mound" ); t_fungus = ter_id( "t_fungus" ); t_shrub_fungal = ter_id( "t_shrub_fungal" ); t_tree_fungal = ter_id( "t_tree_fungal" ); t_tree_fungal_young = ter_id( "t_tree_fungal_young" ); t_marloss_tree = ter_id( "t_marloss_tree" ); t_water_sh = ter_id( "t_water_sh" ); t_water_dp = ter_id( "t_water_dp" ); t_swater_sh = ter_id( "t_swater_sh" ); t_swater_dp = ter_id( "t_swater_dp" ); t_water_pool = ter_id( "t_water_pool" ); t_sewage = ter_id( "t_sewage" ); t_lava = ter_id( "t_lava" ); t_sandbox = ter_id( "t_sandbox" ); t_slide = ter_id( "t_slide" ); t_monkey_bars = ter_id( "t_monkey_bars" ); t_backboard = ter_id( "t_backboard" ); t_gas_pump = ter_id( "t_gas_pump" ); t_gas_pump_smashed = ter_id( "t_gas_pump_smashed" ); t_diesel_pump = ter_id( "t_diesel_pump" ); t_diesel_pump_smashed = ter_id( "t_diesel_pump_smashed" ); t_atm = ter_id( "t_atm" ); t_generator_broken = ter_id( "t_generator_broken" ); t_missile = ter_id( "t_missile" ); t_missile_exploded = ter_id( "t_missile_exploded" ); t_radio_tower = ter_id( "t_radio_tower" ); t_radio_controls = ter_id( "t_radio_controls" ); t_console_broken = ter_id( "t_console_broken" ); t_console = ter_id( "t_console" ); t_gates_mech_control = ter_id( "t_gates_mech_control" ); t_gates_control_brick = ter_id( "t_gates_control_brick" ); t_gates_control_concrete = ter_id( "t_gates_control_concrete" ); t_barndoor = ter_id( "t_barndoor" ); t_palisade_pulley = ter_id( "t_palisade_pulley" ); t_gates_control_metal = ter_id( "t_gates_control_metal" ); t_sewage_pipe = ter_id( "t_sewage_pipe" ); t_sewage_pump = ter_id( "t_sewage_pump" ); t_centrifuge = ter_id( "t_centrifuge" ); t_column = ter_id( "t_column" ); t_vat = ter_id( "t_vat" ); t_rootcellar = ter_id( "t_rootcellar" ); t_cvdbody = ter_id( "t_cvdbody" ); t_cvdmachine = ter_id( "t_cvdmachine" ); t_stairs_down = ter_id( "t_stairs_down" ); t_stairs_up = ter_id( "t_stairs_up" ); t_manhole = ter_id( "t_manhole" ); t_ladder_up = ter_id( "t_ladder_up" ); t_ladder_down = ter_id( "t_ladder_down" ); t_slope_down = ter_id( "t_slope_down" ); t_slope_up = ter_id( "t_slope_up" ); t_rope_up = ter_id( "t_rope_up" ); t_manhole_cover = ter_id( "t_manhole_cover" ); t_card_science = ter_id( "t_card_science" ); t_card_military = ter_id( "t_card_military" ); t_card_reader_broken = ter_id( "t_card_reader_broken" ); t_slot_machine = ter_id( "t_slot_machine" ); t_elevator_control = ter_id( "t_elevator_control" ); t_elevator_control_off = ter_id( "t_elevator_control_off" ); t_elevator = ter_id( "t_elevator" ); t_pedestal_wyrm = ter_id( "t_pedestal_wyrm" ); t_pedestal_temple = ter_id( "t_pedestal_temple" ); t_rock_red = ter_id( "t_rock_red" ); t_rock_green = ter_id( "t_rock_green" ); t_rock_blue = ter_id( "t_rock_blue" ); t_floor_red = ter_id( "t_floor_red" ); t_floor_green = ter_id( "t_floor_green" ); t_floor_blue = ter_id( "t_floor_blue" ); t_switch_rg = ter_id( "t_switch_rg" ); t_switch_gb = ter_id( "t_switch_gb" ); t_switch_rb = ter_id( "t_switch_rb" ); t_switch_even = ter_id( "t_switch_even" ); t_covered_well = ter_id( "t_covered_well" ); t_water_pump = ter_id( "t_water_pump" ); t_conveyor = ter_id( "t_conveyor" ); t_machinery_light = ter_id( "t_machinery_light" ); t_machinery_heavy = ter_id( "t_machinery_heavy" ); t_machinery_old = ter_id( "t_machinery_old" ); t_machinery_electronic = ter_id( "t_machinery_electronic" ); t_open_air = ter_id( "t_open_air" ); t_plut_generator = ter_id( "t_plut_generator" ); t_pavement_bg_dp = ter_id( "t_pavement_bg_dp" ); t_pavement_y_bg_dp = ter_id( "t_pavement_y_bg_dp" ); t_sidewalk_bg_dp = ter_id( "t_sidewalk_bg_dp" ); t_guardrail_bg_dp = ter_id( "t_guardrail_bg_dp" ); t_improvised_shelter = ter_id( "t_improvised_shelter" ); t_railroad_rubble = ter_id( "t_railroad_rubble" ); t_buffer_stop = ter_id( "t_buffer_stop" ); t_railroad_crossing_signal = ter_id( "t_railroad_crossing_signal" ); t_crossbuck_metal = ter_id( "t_crossbuck_metal" ); t_crossbuck_wood = ter_id( "t_crossbuck_wood" ); t_railroad_tie = ter_id( "t_railroad_tie" ); t_railroad_tie_h = ter_id( "t_railroad_tie_h" ); t_railroad_tie_v = ter_id( "t_railroad_tie_v" ); t_railroad_tie_d = ter_id( "t_railroad_tie_d" ); t_railroad_track = ter_id( "t_railroad_track" ); t_railroad_track_h = ter_id( "t_railroad_track_h" ); t_railroad_track_v = ter_id( "t_railroad_track_v" ); t_railroad_track_d = ter_id( "t_railroad_track_d" ); t_railroad_track_d1 = ter_id( "t_railroad_track_d1" ); t_railroad_track_d2 = ter_id( "t_railroad_track_d2" ); t_railroad_track_on_tie = ter_id( "t_railroad_track_on_tie" ); t_railroad_track_h_on_tie = ter_id( "t_railroad_track_h_on_tie" ); t_railroad_track_v_on_tie = ter_id( "t_railroad_track_v_on_tie" ); t_railroad_track_d_on_tie = ter_id( "t_railroad_track_d_on_tie" ); for( auto &elem : terrain_data.get_all() ) { ter_t &ter = const_cast<ter_t&>( elem ); if( ter.trap_id_str.empty() ) { ter.trap = tr_null; } else { ter.trap = trap_str_id( ter.trap_id_str ); } } }
// We're reading in way too many entities here to mess around with creating sub-objects and // seeking around in them, so we're using the json streaming API. submap *mapbuffer::unserialize_submaps( const tripoint &p ) { // Map the tripoint to the submap quad that stores it. const tripoint om_addr = overmapbuffer::sm_to_omt_copy( p ); const tripoint segment_addr = overmapbuffer::omt_to_seg_copy( om_addr ); std::stringstream quad_path; quad_path << world_generator->active_world->world_path << "/maps/" << segment_addr.x << "." << segment_addr.y << "." << segment_addr.z << "/" << om_addr.x << "." << om_addr.y << "." << om_addr.z << ".map"; std::ifstream fin( quad_path.str().c_str() ); if( !fin.is_open() ) { // If it doesn't exist, trigger generating it. return NULL; } JsonIn jsin( fin ); jsin.start_array(); while( !jsin.end_array() ) { std::unique_ptr<submap> sm(new submap()); tripoint submap_coordinates; jsin.start_object(); bool rubpow_update = false; while( !jsin.end_object() ) { std::string submap_member_name = jsin.get_member_name(); if( submap_member_name == "version" ) { if (jsin.get_int() < 22) { rubpow_update = true; } } else if( submap_member_name == "coordinates" ) { jsin.start_array(); int locx = jsin.get_int(); int locy = jsin.get_int(); int locz = jsin.get_int(); jsin.end_array(); submap_coordinates = tripoint( locx, locy, locz ); } else if( submap_member_name == "turn_last_touched" ) { sm->turn_last_touched = jsin.get_int(); } else if( submap_member_name == "temperature" ) { sm->temperature = jsin.get_int(); } else if( submap_member_name == "terrain" ) { // TODO: try block around this to error out if we come up short? jsin.start_array(); // Small duplication here so that the update check is only performed once if (rubpow_update) { std::string ter_string; item rock = item("rock", 0); item chunk = item("steel_chunk", 0); for( int j = 0; j < SEEY; j++ ) { for( int i = 0; i < SEEX; i++ ) { ter_string = jsin.get_string(); if (ter_string == "t_rubble") { sm->ter[i][j] = termap[ "t_dirt" ].loadid; sm->frn[i][j] = furnmap[ "f_rubble" ].loadid; sm->itm[i][j].push_back( rock ); sm->itm[i][j].push_back( rock ); } else if (ter_string == "t_wreckage"){ sm->ter[i][j] = termap[ "t_dirt" ].loadid; sm->frn[i][j] = furnmap[ "f_wreckage" ].loadid; sm->itm[i][j].push_back( chunk ); sm->itm[i][j].push_back( chunk ); } else if (ter_string == "t_ash"){ sm->ter[i][j] = termap[ "t_dirt" ].loadid; sm->frn[i][j] = furnmap[ "f_ash" ].loadid; } else if (ter_string == "t_pwr_sb_support_l"){ sm->ter[i][j] = termap[ "t_support_l" ].loadid; } else if (ter_string == "t_pwr_sb_switchgear_l"){ sm->ter[i][j] = termap[ "t_switchgear_l" ].loadid; } else if (ter_string == "t_pwr_sb_switchgear_s"){ sm->ter[i][j] = termap[ "t_switchgear_s" ].loadid; } else { sm->ter[i][j] = terfind( ter_string ); } } } } else { for( int j = 0; j < SEEY; j++ ) { for( int i = 0; i < SEEX; i++ ) { sm->ter[i][j] = terfind( jsin.get_string() ); } } } jsin.end_array(); } else if( submap_member_name == "radiation" ) { int rad_cell = 0; jsin.start_array(); while( !jsin.end_array() ) { int rad_strength = jsin.get_int(); int rad_num = jsin.get_int(); for( int i = 0; i < rad_num; ++i ) { // A little array trick here, assign to it as a 1D array. // If it's not in bounds we're kinda hosed anyway. sm->set_radiation(0, rad_cell, rad_strength); rad_cell++; } } } else if( submap_member_name == "furniture" ) { jsin.start_array(); while( !jsin.end_array() ) { jsin.start_array(); int i = jsin.get_int(); int j = jsin.get_int(); sm->frn[i][j] = furnmap[ jsin.get_string() ].loadid; jsin.end_array(); } } else if( submap_member_name == "items" ) { jsin.start_array(); while( !jsin.end_array() ) { int i = jsin.get_int(); int j = jsin.get_int(); jsin.start_array(); while( !jsin.end_array() ) { item tmp; jsin.read( tmp ); if( tmp.is_emissive() ) { sm->update_lum_add(tmp, i, j); } tmp.visit_items([&sm,i,j]( item *it ) { for( auto& e: it->magazine_convert() ) { sm->itm[i][j].push_back( e ); } return VisitResponse::NEXT; } ); sm->itm[i][j].push_back( tmp ); if( tmp.needs_processing() ) { sm->active_items.add( std::prev(sm->itm[i][j].end()), point( i, j ) ); } } } } else if( submap_member_name == "traps" ) { jsin.start_array(); while( !jsin.end_array() ) { jsin.start_array(); int i = jsin.get_int(); int j = jsin.get_int(); // TODO: jsin should support returning an id like jsin.get_id<trap>() sm->trp[i][j] = trap_str_id( jsin.get_string() ); jsin.end_array(); } } else if( submap_member_name == "fields" ) { jsin.start_array(); while( !jsin.end_array() ) { // Coordinates loop int i = jsin.get_int(); int j = jsin.get_int(); jsin.start_array(); while( !jsin.end_array() ) { int type = jsin.get_int(); int density = jsin.get_int(); int age = jsin.get_int(); if (sm->fld[i][j].findField(field_id(type)) == NULL) { sm->field_count++; } sm->fld[i][j].addField(field_id(type), density, age); } } } else if( submap_member_name == "graffiti" ) { jsin.start_array(); while( !jsin.end_array() ) { jsin.start_array(); int i = jsin.get_int(); int j = jsin.get_int(); sm->set_graffiti( i, j, jsin.get_string() ); jsin.end_array(); } } else if(submap_member_name == "cosmetics") { jsin.start_array(); while (!jsin.end_array()) { jsin.start_array(); int i = jsin.get_int(); int j = jsin.get_int(); jsin.read(sm->cosmetics[i][j]); jsin.end_array(); } } else if( submap_member_name == "spawns" ) { jsin.start_array(); while( !jsin.end_array() ) { jsin.start_array(); const mtype_id type = mtype_id( jsin.get_string() ); // TODO: json should know how to read an string_id int count = jsin.get_int(); int i = jsin.get_int(); int j = jsin.get_int(); int faction_id = jsin.get_int(); int mission_id = jsin.get_int(); bool friendly = jsin.get_bool(); std::string name = jsin.get_string(); jsin.end_array(); spawn_point tmp( type, count, i, j, faction_id, mission_id, friendly, name ); sm->spawns.push_back( tmp ); } } else if( submap_member_name == "vehicles" ) { jsin.start_array(); while( !jsin.end_array() ) { vehicle *tmp = new vehicle(); jsin.read( *tmp ); sm->vehicles.push_back( tmp ); } } else if( submap_member_name == "computers" ) { std::string computer_data = jsin.get_string(); sm->comp.load_data( computer_data ); } else if( submap_member_name == "camp" ) { std::string camp_data = jsin.get_string(); sm->camp.load_data( camp_data ); } else { jsin.skip_value(); } } if( !add_submap( submap_coordinates, sm ) ) { debugmsg( "submap %d,%d,%d was already loaded", submap_coordinates.x, submap_coordinates.y, submap_coordinates.z ); } } if( submaps.count( p ) == 0 ) { debugmsg("file %s did not contain the expected submap %d,%d,%d", quad_path.str().c_str(), p.x, p.y, p.z); return NULL; } return submaps[ p ]; }
bool trap::is_3x3_trap() const { // TODO make this a json flag, implement more 3x3 traps. return id == trap_str_id( "tr_engine" ); }