From 9941bb8587892a721dbbb7e61d762eb40e4f2093 Mon Sep 17 00:00:00 2001 From: "giacomand@gmail.com" Date: Sun, 2 Dec 2012 04:38:43 +0000 Subject: [PATCH] Added mimics! There's the classic crate (chest) mimic which waits until somebody is close before trying to attack them. You can fill him with loot by putting items on him on your map. This was done by changing the base initialize proc to an /atom/movable and then instead of looping through the world for objects, instead loop for atom movables. The next type of mimic is for the staff of animation! They will copy the icon of the object they're copying and will set themselves stats based on the object too. They will not attack the bearer of the staff which made them animated. Added the option to get the staff on the wizard's spell book. Added a "friends" var to hostile mobs. It will make the simple animal ignore friends when choosing targets. Changed the statues from /obj/effect/showcase to /obj/structure/showcase. Added a new variable to projectiles, "shot_from" is the gun that shot the projectile. It's used to determine what staff animated the mob and it will then add that staff, so it can ignore it when choosing targets. Added a wander var for simple animals, turning it to 0 will stop the simple animal from moving when idle. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@5246 316c924e-a436-60f5-8080-3fe189b3f50e --- code/__HELPERS/unsorted.dm | 7 + code/controllers/master_controller.dm | 2 +- code/defines/obj.dm | 2 +- code/game/gamemodes/wizard/spellbook.dm | 13 +- code/game/objects/objs.dm | 2 +- .../living/simple_animal/hostile/hostile.dm | 12 +- .../mob/living/simple_animal/hostile/mimic.dm | 183 ++++++++++++++++++ .../mob/living/simple_animal/simple_animal.dm | 52 +++-- code/modules/projectiles/gun.dm | 1 + .../projectiles/guns/energy/special.dm | 5 + code/modules/projectiles/projectile.dm | 11 +- .../modules/projectiles/projectile/animate.dm | 13 ++ html/changelog.html | 8 + maps/tgstation.2.0.9.dmm | 14 +- tgstation.dme | 2 + 15 files changed, 276 insertions(+), 51 deletions(-) create mode 100644 code/modules/mob/living/simple_animal/hostile/mimic.dm create mode 100644 code/modules/projectiles/projectile/animate.dm diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index b7c205698f5..bd82753d59b 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1195,6 +1195,13 @@ proc/get_mob_with_client_list() location = location.loc return null +/proc/get(atom/loc, type) + while(loc) + if(istype(loc, type)) + return loc + loc = loc.loc + return null + /proc/get_turf_or_move(turf/location) return get_turf(location) diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 51501c2795c..c2ba3db8151 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -69,7 +69,7 @@ datum/controller/game_controller/proc/setup() datum/controller/game_controller/proc/setup_objects() world << "\red \b Initializing objects" sleep(-1) - for(var/obj/object in world) + for(var/atom/movable/object in world) object.initialize() world << "\red \b Initializing pipe networks" diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 4e44aa5f042..5ef738e2f79 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -119,7 +119,7 @@ var/moving = null var/list/parts = list( ) -/obj/effect/showcase +/obj/structure/showcase name = "Showcase" icon = 'icons/obj/stationobjs.dmi' icon_state = "showcase_1" diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 474aa85eff5..30afbcf6c68 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -38,8 +38,10 @@ dat += "
" dat += "Mastercrafted Armor Set
" dat += "
" + dat += "Staff of Animation
" + dat += "
" if(op) - dat += "Re-memorize Spells
" + dat += "Re-memorize Spells
" user << browse(dat, "window=radio") onclose(user, "radio") return @@ -54,7 +56,7 @@ if ( src.loc == usr || (in_range(src,usr) && istype(src.loc, /turf))) usr.set_machine(src) if(href_list["spell_choice"]) - if(src.uses >= 1 && src.max_uses >=1 && text2num(href_list["spell_choice"]) < 18) + if(src.uses >= 1 && src.max_uses >=1 && text2num(href_list["spell_choice"]) < 19) src.uses-- var/list/available_spells = list("Magic Missile","Fireball","Disintegrate","Disable Tech","Smoke","Blind","Mind Transfer","Forcewall","Blink","Teleport","Mutate","Ethereal Jaunt","Knock","Summon Guns","Staff of Change","Six Soul Stone Shards and the spell Artificer","Mastercrafted Armor Set") var/already_knows = 0 @@ -142,8 +144,13 @@ new /obj/item/clothing/head/helmet/space/rig/wizard(get_turf(usr)) src.temp = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space." src.max_uses-- + if("18") + feedback_add_details("wizard_spell_learned","SA") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + new /obj/item/weapon/gun/energy/staff/animate(get_turf(usr)) + src.temp = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines." + src.max_uses-- - if (href_list["spell_choice"] == "18") + if (href_list["spell_choice"] == "19") var/area/wizard_station/A = locate() if(usr in A.contents) src.uses = src.max_uses diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 9b72f8cda04..5df86fd9554 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -44,7 +44,7 @@ else return null -/obj/proc/initialize() +/atom/movable/proc/initialize() return /obj/proc/updateUsrDialog() diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 610716c3c32..f686de963e1 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -9,6 +9,7 @@ var/projectilesound var/casingtype var/move_to_delay = 2 //delay for the automated movement. + var/list/friends = list() stop_automated_movement_when_pulled = 0 /mob/living/simple_animal/hostile/proc/FindTarget() @@ -21,6 +22,8 @@ var/mob/living/L = A if(L.faction == src.faction && !attack_same) continue + else if(L in friends) + continue else if(!L.stat) stance = HOSTILE_STANCE_ATTACK @@ -34,7 +37,7 @@ break return T -/mob/living/simple_animal/hostile/proc/MoveToTarget(var/step = 5) +/mob/living/simple_animal/hostile/proc/MoveToTarget() stop_automated_movement = 1 if(!target_mob || SA_attackable(target_mob)) stance = HOSTILE_STANCE_IDLE @@ -53,12 +56,13 @@ stop_automated_movement = 1 if(!target_mob || SA_attackable(target_mob)) LoseTarget() - return + return 0 if(!(target_mob in ListTargets())) LostTarget() - return + return 0 if(get_dist(src, target_mob) <= 1) //Attacking AttackingTarget() + return 1 /mob/living/simple_animal/hostile/proc/AttackingTarget() if(isliving(target_mob)) @@ -109,8 +113,6 @@ DestroySurroundings() AttackTarget() - - /mob/living/simple_animal/hostile/proc/OpenFire(target_mob) var/target = target_mob visible_message("\red [src] fires at [target]!", 1) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm new file mode 100644 index 00000000000..60687c247bc --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -0,0 +1,183 @@ +// +// Abstract Class +// + +/mob/living/simple_animal/hostile/mimic + name = "crate" + desc = "A rectangular steel crate." + icon = 'icons/obj/storage.dmi' + icon_state = "crate" + icon_living = "crate" + + meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat + response_help = "touches the" + response_disarm = "pushes the" + response_harm = "hits the" + speed = -1 + maxHealth = 250 + health = 250 + + harm_intent_damage = 5 + melee_damage_lower = 8 + melee_damage_upper = 12 + attacktext = "attacks" + attack_sound = 'sound/weapons/bite.ogg' + + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + + faction = "mimic" + move_to_delay = 8 + +/mob/living/simple_animal/hostile/mimic/FindTarget() + . = ..() + if(.) + emote("growls at [.]") + +/mob/living/simple_animal/hostile/mimic/Die() + ..() + visible_message("\red [src] stops moving!") + del(src) + + + +// +// Crate Mimic +// + + +// Aggro when you try to open them. Will also pickup loot when spawns and drop it when dies. +/mob/living/simple_animal/hostile/mimic/crate + + attacktext = "bites" + + stop_automated_movement = 1 + wander = 0 + var/attempt_open = 0 + +// Pickup loot +/mob/living/simple_animal/hostile/mimic/crate/initialize() + ..() + for(var/obj/item/I in loc) + I.loc = src + +/mob/living/simple_animal/hostile/mimic/crate/DestroySurroundings() + ..() + if(prob(90)) + icon_state = "[initial(icon_state)]open" + else + icon_state = initial(icon_state) + +/mob/living/simple_animal/hostile/mimic/crate/ListTargets() + if(attempt_open) + return view(src, 10) + return view(src, 1) + +/mob/living/simple_animal/hostile/mimic/crate/FindTarget() + . = ..() + if(.) + trigger() + +/mob/living/simple_animal/hostile/mimic/crate/AttackingTarget() + . = ..() + if(.) + icon_state = initial(icon_state) + +/mob/living/simple_animal/hostile/mimic/crate/proc/trigger() + if(!attempt_open) + visible_message("[src] starts to move!") + attempt_open = 1 + +/mob/living/simple_animal/hostile/mimic/crate/adjustBruteLoss(var/damage) + trigger() + ..(damage) + +/mob/living/simple_animal/hostile/mimic/crate/LoseTarget() + ..() + icon_state = initial(icon_state) + +/mob/living/simple_animal/hostile/mimic/crate/LostTarget() + ..() + icon_state = initial(icon_state) + +/mob/living/simple_animal/hostile/mimic/crate/Die() + + var/obj/structure/closet/crate/C = new(get_turf(src)) + // Put loot in crate + for(var/obj/O in src) + O.loc = C + ..() + +/mob/living/simple_animal/hostile/mimic/crate/AttackingTarget() + . =..() + var/mob/living/L = . + if(istype(L)) + if(prob(15)) + L.Weaken(2) + L.visible_message("\the [src] knocks down \the [L]!") + +// +// Copy Mimic +// + +var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/cable, /obj/structure/window) + +/mob/living/simple_animal/hostile/mimic/copy + + health = 100 + maxHealth = 100 + var/obj/item/staff = null // the staff that changed they, never attack the bearer of this staff + var/destroy_objects = 0 + +/mob/living/simple_animal/hostile/mimic/copy/New(loc, var/obj/copy, var/obj/item/staff) + ..(loc) + CopyObject(copy, staff) + +/mob/living/simple_animal/hostile/mimic/copy/Die() + + for(var/atom/movable/M in src) + M.loc = get_turf(src) + ..() + +/mob/living/simple_animal/hostile/mimic/copy/ListTargets() + // Return a list of targets that isn't the holder of our staff + return view(src, 7) - get(staff, /mob) + +/mob/living/simple_animal/hostile/mimic/copy/proc/CopyObject(var/obj/O, var/obj/item/staff) + + if((istype(O, /obj/item) || istype(O, /obj/structure)) && !is_type_in_list(O, protected_objects)) + + O.loc = src + name = O.name + desc = O.desc + icon = O.icon + icon_state = O.icon_state + icon_living = icon_state + + if(istype(O, /obj/structure)) + health = (anchored * 50) + 50 + destroy_objects = 1 + else if(istype(O, /obj/item)) + var/obj/item/I = O + health = 15 * I.w_class + melee_damage_lower = 2 + I.force + melee_damage_upper = 2 + I.force + move_to_delay = 2 * I.w_class + + maxHealth = health + if(staff) + src.staff = staff + return 1 + return + +/mob/living/simple_animal/hostile/mimic/copy/DestroySurroundings() + if(destroy_objects) + ..() + diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 38efa87cd60..e3be6a83b3f 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -20,6 +20,7 @@ var/meat_amount = 0 var/meat_type var/stop_automated_movement = 0 //Use this to temporarely stop random movement or to if you write special movement code for animals. + var/wander = 1 // Does the mob wander around when idle? var/stop_automated_movement_when_pulled = 1 //When set to 1 this stops the animal from moving when someone is pulling it. //Interaction @@ -95,7 +96,7 @@ AdjustParalysis(-1) //Movement - if(!client && !stop_automated_movement) + if(!client && !stop_automated_movement && wander) if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc. turns_since_move++ if(turns_since_move >= turns_per_move) @@ -186,12 +187,12 @@ //Atmos effect if(bodytemperature < minbodytemp) - health -= cold_damage_per_tick + adjustBruteLoss(cold_damage_per_tick) else if(bodytemperature > maxbodytemp) - health -= heat_damage_per_tick + adjustBruteLoss(heat_damage_per_tick) if(!atmos_suitable) - health -= unsuitable_atoms_damage + adjustBruteLoss(unsuitable_atoms_damage) return 1 /mob/living/simple_animal/Bumped(AM as mob|obj) @@ -241,11 +242,11 @@ M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])") src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])") var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - health -= damage + adjustBruteLoss(damage) /mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) if(!Proj) return - src.health -= Proj.damage + adjustBruteLoss(Proj.damage) return 0 /mob/living/simple_animal/attack_hand(mob/living/carbon/human/M as mob) @@ -264,6 +265,7 @@ return if (!(status_flags & CANPUSH)) return + var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M, M, src ) M.put_in_active_hand(G) @@ -277,17 +279,12 @@ if ((O.client && !( O.blinded ))) O.show_message(text("\red [] has grabbed [] passively!", M, src), 1) - if("hurt") - health -= harm_intent_damage + if("hurt", "disarm") + adjustBruteLoss(harm_intent_damage) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) O.show_message("\red [M] [response_harm] [src]") - if("disarm") - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message("\blue [M] [response_disarm] [src]") - return /mob/living/simple_animal/attack_alien(mob/living/carbon/alien/humanoid/M as mob) @@ -295,6 +292,7 @@ switch(M.a_intent) if ("help") + for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) O.show_message(text("\blue [M] caresses [src] with its scythe like arm."), 1) @@ -303,6 +301,7 @@ return if(!(status_flags & CANPUSH)) return + var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M, M, src ) M.put_in_active_hand(G) @@ -316,16 +315,10 @@ if ((O.client && !( O.blinded ))) O.show_message(text("\red [] has grabbed [] passively!", M, src), 1) - if("hurt") + if("hurt", "disarm") var/damage = rand(15, 30) visible_message("\red [M] has slashed at [src]!") - src.health -= damage - - - if("disarm") - var/damage = rand(15, 30) - visible_message("\red [M] has slashed at [src]!") - src.health -= damage + adjustBruteLoss(damage) return @@ -335,23 +328,25 @@ if("help") visible_message("\blue [L] rubs it's head against [src]") + else var/damage = rand(5, 10) visible_message("\red [L] bites [src]!") if(stat != DEAD) - src.health -= damage + adjustBruteLoss(damage) L.amount_grown = min(L.amount_grown + damage, L.max_grown) /mob/living/simple_animal/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri if(istype(O, /obj/item/stack/medical)) + if(stat != DEAD) var/obj/item/stack/medical/MED = O if(health < maxHealth) if(MED.amount >= 1) - health = min(maxHealth, health + MED.heal_brute) + adjustBruteLoss(-MED.heal_brute) MED.amount -= 1 if(MED.amount <= 0) del(MED) @@ -372,7 +367,7 @@ var/damage = O.force if (O.damtype == HALLOSS) damage = 0 - health -= damage + adjustBruteLoss(damage) for(var/mob/M in viewers(src, null)) if ((M.client && !( M.blinded ))) M.show_message("\red \b [src] has been attacked with the [O] by [user]. ") @@ -383,6 +378,7 @@ M.show_message("\red [user] gently taps [src] with the [O]. ") + /mob/living/simple_animal/movement_delay() var/tally = 0 //Incase I need to add stuff other than "speed" later @@ -409,19 +405,19 @@ flick("flash", flash) switch (severity) if (1.0) - health -= 500 + adjustBruteLoss(500) gib() return if (2.0) - health -= 60 + adjustBruteLoss(60) if(3.0) - health -= 30 + adjustBruteLoss(30) /mob/living/simple_animal/adjustBruteLoss(damage) - health -= damage + health = Clamp(health - damage, 0, maxHealth) /mob/living/simple_animal/proc/SA_attackable(target_mob) if (isliving(target_mob)) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index ad3eeb90926..fbba8b87be9 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -107,6 +107,7 @@ in_chamber.original = target in_chamber.loc = get_turf(user) in_chamber.starting = get_turf(user) + in_chamber.shot_from = src user.next_move = world.time + 4 in_chamber.silenced = silenced in_chamber.current = curloc diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 06e7e3107c3..7cad1c58876 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -64,6 +64,11 @@ obj/item/weapon/gun/energy/staff update_icon() return +/obj/item/weapon/gun/energy/staff/animate + name = "staff of animation" + desc = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines." + projectile_type = "/obj/item/projectile/animate" + /obj/item/weapon/gun/energy/floragun name = "floral somatoray" desc = "A tool that discharges controlled radiation which induces mutation in plant cells." diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index fbf15d020b0..b9914f7baec 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -26,6 +26,7 @@ var/yo = null var/xo = null var/current = null + var/obj/shot_from = null // the object which shot us var/atom/original = null // the original target clicked var/turf/starting = null // the projectile's starting turf var/list/permutated = list() // we've passed through these atoms, don't try to hit them again @@ -61,9 +62,9 @@ Bump(atom/A as mob|obj|turf|area) if(A == firer) loc = A.loc - return //cannot shoot yourself + return 0 //cannot shoot yourself - if(bumped) return + if(bumped) return 0 var/forcedodge = 0 // force the projectile to pass bumped = 1 @@ -71,7 +72,7 @@ var/mob/M = A if(!istype(A, /mob/living)) loc = A.loc - return // nope.avi + return 0// nope.avi // check for dodge (i can't place in bullet_act because then things get wonky) if(!M.stat && !M.lying && (REFLEXES in M.augmentations) && prob(85)) @@ -104,7 +105,7 @@ else loc = A.loc permutated.Add(A) - return + return 0 if(istype(A,/turf)) for(var/obj/O in A) @@ -115,7 +116,7 @@ density = 0 invisibility = 101 del(src) - return + return 1 CanPass(atom/movable/mover, turf/target, height=0, air_group=0) diff --git a/code/modules/projectiles/projectile/animate.dm b/code/modules/projectiles/projectile/animate.dm new file mode 100644 index 00000000000..af229e6502f --- /dev/null +++ b/code/modules/projectiles/projectile/animate.dm @@ -0,0 +1,13 @@ +/obj/item/projectile/animate + name = "bolt of animation" + icon_state = "ice_1" + damage = 0 + damage_type = BURN + nodamage = 1 + flag = "energy" + +/obj/item/projectile/animate/Bump(var/atom/change) + . = ..() + if(istype(change, /obj/item) || istype(change, /obj/structure) && !is_type_in_list(change, protected_objects)) + var/obj/O = change + new /mob/living/simple_animal/hostile/mimic/copy(O.loc, O, shot_from) diff --git a/html/changelog.html b/html/changelog.html index 705ede6b550..f33443df306 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -48,6 +48,14 @@ Stuff which is in development and not yet visible to players or just code relate should be listed in the changelog upon commit tho. Thanks. --> +
+

02 December 2012

+

Giacom updated:

+ +
+

30 November 2012

Petethegoat updated:

diff --git a/maps/tgstation.2.0.9.dmm b/maps/tgstation.2.0.9.dmm index 20a136768ec..46664af07dc 100644 --- a/maps/tgstation.2.0.9.dmm +++ b/maps/tgstation.2.0.9.dmm @@ -4335,7 +4335,7 @@ "bFs" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/table,/obj/item/device/taperecorder{pixel_x = -3},/obj/item/device/paicard{pixel_x = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) "bFt" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) "bFu" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/hor) -"bFv" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"bFv" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/item/weapon/pen,/obj/item/weapon/pen,/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bFw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/toxins/mixing) "bFx" = (/obj/machinery/atmospherics/valve,/turf/simulated/floor{icon_state = "white"},/area/toxins/mixing) "bFy" = (/turf/simulated/floor{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/mixing) @@ -4368,7 +4368,7 @@ "bFZ" = (/turf/simulated/floor,/area/storage/tech) "bGa" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/storage/tech) "bGb" = (/turf/simulated/wall/r_wall,/area/hallway/primary/aft) -"bGc" = (/obj/effect/showcase{icon_state = "showcase_3"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "showroomfloor"},/area/hallway/primary/aft) +"bGc" = (/obj/machinery/light/small{dir = 8},/obj/structure/showcase{icon_state = "showcase_2"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/hallway/primary/aft) "bGd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/primary/aft) "bGe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/hallway/primary/aft) "bGf" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/aft) @@ -4441,7 +4441,7 @@ "bHu" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/crew{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/card{pixel_x = 2; pixel_y = -2},/obj/item/weapon/circuitboard/communications{pixel_x = 5; pixel_y = -5},/turf/simulated/floor,/area/storage/tech) "bHv" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/borgupload{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/aiupload{pixel_x = 2; pixel_y = -2},/turf/simulated/floor,/area/storage/tech) "bHw" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/robotics{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/mecha_control{pixel_x = 1; pixel_y = -1},/turf/simulated/floor,/area/storage/tech) -"bHx" = (/obj/effect/showcase{icon_state = "showcase_2"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/hallway/primary/aft) +"bHx" = (/obj/structure/showcase{icon_state = "showcase_3"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/hallway/primary/aft) "bHy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/aft) "bHz" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "cautioncorner"; dir = 2},/area/hallway/primary/aft) "bHA" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor{icon_state = "bot"},/area/atmos) @@ -4510,7 +4510,7 @@ "bIL" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/structure/grille,/turf/simulated/floor/plating,/area/storage/tech) "bIM" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/turf/simulated/floor/plating,/area/storage/tech) "bIN" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/obj/structure/grille,/turf/simulated/floor/plating,/area/storage/tech) -"bIO" = (/obj/effect/showcase{icon_state = "showcase_5"; pixel_x = -2},/turf/simulated/floor{icon_state = "showroomfloor"},/area/hallway/primary/aft) +"bIO" = (/obj/structure/showcase{icon_state = "showcase_4"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/hallway/primary/aft) "bIP" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor,/area/hallway/primary/aft) "bIQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/hallway/primary/aft) "bIR" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "caution"; dir = 4},/area/hallway/primary/aft) @@ -4561,7 +4561,7 @@ "bJK" = (/turf/simulated/floor/airless{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/toxins/test_area) "bJL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/aft) "bJM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/maintenance/aft) -"bJN" = (/obj/effect/showcase{icon_state = "showcase_4"; pixel_x = -2},/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "showroomfloor"},/area/hallway/primary/aft) +"bJN" = (/obj/machinery/light/small{dir = 8},/obj/structure/showcase{icon_state = "showcase_5"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/hallway/primary/aft) "bJO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/aft) "bJP" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/hallway/primary/aft) "bJQ" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "caution"; dir = 4},/area/hallway/primary/aft) @@ -7164,10 +7164,10 @@ "cHN" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (NORTHEAST)"; icon_state = "fakewindows"; dir = 5},/area/wizard_station) "cHO" = (/obj/item/trash/raisins,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "cHP" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"cHQ" = (/obj/effect/showcase,/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station) +"cHQ" = (/obj/structure/showcase,/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station) "cHR" = (/obj/structure/table/reinforced,/obj/structure/kitchenspike,/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station) "cHS" = (/obj/structure/table/reinforced,/obj/structure/kitchenspike,/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station) -"cHT" = (/obj/effect/showcase,/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station) +"cHT" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/showcase,/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station) "cHU" = (/obj/effect/decal/remains/human,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) "cHV" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) "cHW" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (NORTH)"; icon_state = "fakewindows2"; dir = 1},/area/wizard_station) diff --git a/tgstation.dme b/tgstation.dme index 0d1d3fa45b7..5502dd9b06e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -906,6 +906,7 @@ #include "code\modules\mob\living\simple_animal\hostile\faithless.dm" #include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" +#include "code\modules\mob\living\simple_animal\hostile\mimic.dm" #include "code\modules\mob\living\simple_animal\hostile\pirate.dm" #include "code\modules\mob\living\simple_animal\hostile\russian.dm" #include "code\modules\mob\living\simple_animal\hostile\syndicate.dm" @@ -977,6 +978,7 @@ #include "code\modules\projectiles\guns\projectile\pistol.dm" #include "code\modules\projectiles\guns\projectile\revolver.dm" #include "code\modules\projectiles\guns\projectile\shotgun.dm" +#include "code\modules\projectiles\projectile\animate.dm" #include "code\modules\projectiles\projectile\beams.dm" #include "code\modules\projectiles\projectile\bullets.dm" #include "code\modules\projectiles\projectile\change.dm"