diff --git a/code/game/objects/washing_machine.dm b/code/game/machinery/washing_machine.dm similarity index 100% rename from code/game/objects/washing_machine.dm rename to code/game/machinery/washing_machine.dm diff --git a/code/game/objects/alien/acid.dm b/code/game/objects/alien/acid.dm deleted file mode 100644 index a1af1180019..00000000000 --- a/code/game/objects/alien/acid.dm +++ /dev/null @@ -1,13 +0,0 @@ -/obj/effect/alien/acid/proc/tick() - ticks += 1 - for(var/mob/O in hearers(src, null)) - O.show_message("\green [src.target] sizzles and begins to melt under the bubbling mess of acid!", 1) - if(prob(ticks*10)) - for(var/mob/O in hearers(src, null)) - O.show_message("\green [src.target] collapses under its own weight into a puddle of goop and undigested debris!", 1) -// if(target.occupant) //I tried to fix mechas-with-humans-getting-deleted. Made them unacidable for now. -// target.ex_act(1) - del(target) - del(src) - return - spawn(rand(200, 600)) tick() diff --git a/code/game/objects/alien/defines.dm b/code/game/objects/alien/defines.dm deleted file mode 100644 index a91346449f3..00000000000 --- a/code/game/objects/alien/defines.dm +++ /dev/null @@ -1,54 +0,0 @@ -/obj/effect/alien - name = "alien thing" - desc = "theres something alien about this" - icon = 'icons/mob/alien.dmi' -// unacidable = 1 //Aliens won't ment their own. - -/obj/effect/alien/resin - name = "resin" - desc = "Looks like some kind of slimy growth." - icon_state = "resin" - - density = 1 - opacity = 1 - anchored = 1 - var/health = 50 - //var/mob/living/affecting = null - - wall - name = "resin wall" - desc = "Purple slime solidified into a wall." - icon_state = "resinwall" //same as resin, but consistency ho! - - membrane - name = "resin membrane" - desc = "Purple slime just thin enough to let light pass through." - icon_state = "resinmembrane" - opacity = 0 - health = 20 - -/obj/effect/alien/weeds - name = "weeds" - desc = "Weird purple weeds." - icon_state = "weeds" - - anchored = 1 - density = 0 - var/health = 50 - - node - icon_state = "weednode" - name = "purple sac" - desc = "Weird purple octopus-like thing." - -/obj/effect/alien/acid - name = "acid" - desc = "Burbling corrossive stuff. I wouldn't want to touch it." - icon_state = "acid" - - density = 0 - opacity = 0 - anchored = 1 - - var/obj/target - var/ticks = 0 \ No newline at end of file diff --git a/code/game/objects/alien/egg.dm b/code/game/objects/alien/egg.dm deleted file mode 100644 index ed292d7381d..00000000000 --- a/code/game/objects/alien/egg.dm +++ /dev/null @@ -1,103 +0,0 @@ -/var/const //for the status var - BURST = 0 - GROWING = 1 - GROWN = 2 - - MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger - MAX_GROWTH_TIME = 3000 - -/obj/effect/alien/egg - desc = "It looks like a weird egg" - name = "egg" - icon_state = "egg_growing" - density = 0 - anchored = 1 - - var/health = 100 - var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive - - New() - if(aliens_allowed) - ..() - spawn(rand(MIN_GROWTH_TIME,MAX_GROWTH_TIME)) - Grow() - else - del(src) - - attack_paw(user as mob) - if(isalien(user)) - switch(status) - if(BURST) - user << "\red The child is already gone." - return - if(GROWING) - user << "\red The child is not developed yet." - return - if(GROWN) - user << "\red You retrieve the child." - loc.contents += GetFacehugger()//need to write the code for giving it to the alien later - Burst() - return - else - return attack_hand(user) - - attack_hand(user as mob) - user << "It feels slimy." - return - - proc/GetFacehugger() - return locate(/obj/item/clothing/mask/facehugger) in contents - - proc/Grow() - icon_state = "egg" - status = GROWN - new /obj/item/clothing/mask/facehugger(src) - return - - proc/Burst() //drops and kills the hugger if any is remaining - var/obj/item/clothing/mask/facehugger/child = GetFacehugger() - - if(child) - loc.contents += child - child.Die() - - icon_state = "egg_hatched" - status = BURST - return - -/obj/effect/alien/egg/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage - ..() - healthcheck() - return - - - -/obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user) - if(health <= 0) - return - if(W.attack_verb.len) - src.visible_message("\red \The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") - else - src.visible_message("\red \The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]") - var/damage = W.force / 4.0 - - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - - if(WT.remove_fuel(0, user)) - damage = 15 - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - - src.health -= damage - src.healthcheck() - - -/obj/effect/alien/egg/proc/healthcheck() - if(health <= 0) - Burst() - -/obj/effect/alien/egg/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 500) - health -= 5 - healthcheck() \ No newline at end of file diff --git a/code/game/objects/alien/resin.dm b/code/game/objects/alien/resin.dm deleted file mode 100644 index 6aee96423dd..00000000000 --- a/code/game/objects/alien/resin.dm +++ /dev/null @@ -1,166 +0,0 @@ -// Resin walls improved. /N - -/obj/effect/alien/resin/proc/healthcheck() - if(health <=0) - density = 0 - /* if(affecting) - var/mob/living/carbon/M = affecting - contents.Remove(affecting) - if(ishuman(M)) - M.verbs += /mob/living/carbon/human/verb/suicide - else - M.verbs += /mob/living/carbon/monkey/verb/suicide - M.loc = loc - M.paralysis += 10 - for(var/mob/O in viewers(src, 3)) - O.show_message(text("A body appeared from the dead resin!"), 1, text("You hear faint moaning somewhere about you."), 2)*/ - del(src) - return - -/obj/effect/alien/resin/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage - ..() - healthcheck() - return - -/obj/effect/alien/resin/ex_act(severity) - switch(severity) - if(1.0) - health-=50 - if(2.0) - health-=50 - if(3.0) - if (prob(50)) - health-=50 - else - health-=25 - healthcheck() - return - -/obj/effect/alien/resin/blob_act() - health-=50 - healthcheck() - return - -/obj/effect/alien/resin/meteorhit() - health-=50 - healthcheck() - return - -/obj/effect/alien/resin/hitby(AM as mob|obj) - ..() - for(var/mob/O in viewers(src, null)) - O.show_message("\red [src] was hit by [AM].", 1) - var/tforce = 0 - if(ismob(AM)) - tforce = 10 - else - tforce = AM:throwforce - playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) - health = max(0, health - tforce) - healthcheck() - ..() - return - -/obj/effect/alien/resin/attack_hand() - if ((HULK in usr.mutations) || (SUPRSTR in usr.augmentations)) - usr << "\blue You easily destroy the [name]." - for(var/mob/O in oviewers(src)) - O.show_message("\red [usr] destroys the [name]!", 1) - health = 0 - healthcheck() - return - -/obj/effect/alien/resin/attack_paw() - return attack_hand() - -/obj/effect/alien/resin/attack_alien() - if (islarva(usr))//Safety check for larva. /N - return - usr << "\green You claw at the [name]." - for(var/mob/O in oviewers(src)) - O.show_message("\red [usr] claws at the resin!", 1) - playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) - health -= rand(10, 20) - if(health <= 0) - usr << "\green You slice the [name] to pieces." - for(var/mob/O in oviewers(src)) - O.show_message("\red [usr] slices the [name] apart!", 1) - healthcheck() - return - -/obj/effect/alien/resin/attackby(obj/item/weapon/W as obj, mob/user as mob) - /*if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) - var/obj/item/weapon/grab/G = W - if(isalien(user)&&(ishuman(G.affecting)||ismonkey(G.affecting))) - //Only aliens can stick humans and monkeys into resin walls. Also, the wall must not have a person inside already. - if(!affecting) - if(G.state<2) - user << "\red You need a better grip to do that!" - return - G.affecting.loc = src - G.affecting.paralysis = 10 - for(var/mob/O in viewers(world.view, src)) - if (O.client) - O << text("\green [] places [] in the resin wall!", G.assailant, G.affecting) - affecting=G.affecting - del(W) - spawn(0) - process() - else - user << "\red This wall is already occupied." - return */ - - var/aforce = W.force - health = max(0, health - aforce) - playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) - healthcheck() - ..() - return - -///obj/effect/alien/resin/process() //Buggy and irrelevant now that you're able to just make nice little infection chambers - Urist - /*if(affecting) - var/mob/living/carbon/M = affecting - var/check = 0 - if(ishuman(affecting))//So they do not suicide and kill the babby. - M.verbs -= /mob/living/carbon/human/verb/suicide - else - check = 1 - M.verbs -= /mob/living/carbon/monkey/verb/suicide - - contents.Add(affecting) - - while(!isnull(M)&&!isnull(src))//While M and wall exist - if(prob(90)&& HULK in M.mutations)//If they're the Hulk, they're getting out. - M << "You smash your way to freedom!" - break - if(prob(30))//Let's people know that someone is trapped in the resin wall. - M << "\green You feel a strange sense of calm as a flesh-like substance seems to completely envelop you." - for(var/mob/O in viewers(src, 3)) - O.show_message(text("There appears to be a person stuck inside a resin wall nearby."), 1, text("You hear faint moaning somewhere about you."), 2) - if(prob(5))//MAYBE they are able to crawl out on their own. Not likely... - M << "You are able to crawl your way through the sticky mass, and out to freedom. But for how long?" - break - M.paralysis = 10//Set theis paralysis to 10 so they cannot act. - sleep(50)//To cut down on processing time - - if(!isnull(src)) - affecting = null - - if(!isnull(M))//As long as they still exist. - if(!check)//And now they can suicide again, even if they are already dead in case they get revived. - M.verbs += /mob/living/carbon/human/verb/suicide - else - M.verbs += /mob/living/carbon/monkey/verb/suicide - for(var/mob/O in viewers(src, 3)) - O.show_message(text("A body appeared from the dead resin!"), 1, text("You hear faint moaning somewhere about you."), 2) - else - for(var/mob/O in viewers(src, 3)) - O.show_message(text("\red An alien larva bursts from the resin wall!"), 1, text("\red You hear a high, alien screech nearby!"), 2)*/ -// return - -/obj/effect/alien/resin/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group) return 0 - if(istype(mover) && mover.checkpass(PASSGLASS)) - return !opacity - return !density diff --git a/code/game/objects/alien/weeds.dm b/code/game/objects/alien/weeds.dm deleted file mode 100644 index 60a72feec8c..00000000000 --- a/code/game/objects/alien/weeds.dm +++ /dev/null @@ -1,108 +0,0 @@ -#define NODERANGE 3 - -/obj/effect/alien/weeds/New() - ..() - if(istype(loc, /turf/space)) - del(src) - return - if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2") - spawn(rand(150,300)) - if(src) - Life() - return - -/obj/effect/alien/weeds/node/New() - ..() - sd_SetLuminosity(NODERANGE) - return - -/obj/effect/alien/weeds/proc/Life() - set background = 1 - var/turf/U = get_turf(src) -/* - if (locate(/obj/movable, U)) - U = locate(/obj/movable, U) - if(U.density == 1) - del(src) - return - -Alien plants should do something if theres a lot of poison - if(U.poison> 200000) - health -= round(U.poison/200000) - update() - return -*/ - if (istype(U, /turf/space)) - del(src) - return - - direction_loop: - for(var/dirn in cardinal) - var/turf/T = get_step(src, dirn) - - if (!istype(T) || T.density || locate(/obj/effect/alien/weeds) in T || istype(T.loc, /area/arrival) || istype(T, /turf/space)) - continue - - if(!(locate(/obj/effect/alien/weeds/node) in view(NODERANGE,T))) - continue - - // if (locate(/obj/movable, T)) // don't propogate into movables - // continue - - for(var/obj/O in T) - if(O.density) - continue direction_loop - - new /obj/effect/alien/weeds(T) - - -/obj/effect/alien/weeds/ex_act(severity) - switch(severity) - if(1.0) - del(src) - if(2.0) - if (prob(50)) - del(src) - if(3.0) - if (prob(5)) - del(src) - return - -/obj/effect/alien/weeds/attackby(var/obj/item/weapon/W, var/mob/user) - if(W.attack_verb.len) - visible_message("\red \The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") - else - visible_message("\red \The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]") - - var/damage = W.force / 4.0 - - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - - if(WT.remove_fuel(0, user)) - damage = 15 - playsound(loc, 'sound/items/Welder.ogg', 100, 1) - - health -= damage - healthcheck() - -/obj/effect/alien/weeds/proc/healthcheck() - if(health <= 0) - del(src) - - -/obj/effect/alien/weeds/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - health -= 5 - healthcheck() - -/*/obj/effect/alien/weeds/burn(fi_amount) - if (fi_amount > 18000) - spawn( 0 ) - del(src) - return - return 0 - return 1 -*/ - -#undef NODRANGE \ No newline at end of file diff --git a/code/game/objects/transfer_valve.dm b/code/game/objects/devices/transfer_valve.dm similarity index 100% rename from code/game/objects/transfer_valve.dm rename to code/game/objects/devices/transfer_valve.dm diff --git a/code/game/objects/uplinks.dm b/code/game/objects/devices/uplinks.dm similarity index 89% rename from code/game/objects/uplinks.dm rename to code/game/objects/devices/uplinks.dm index 40d2cd2e599..30705c12060 100644 --- a/code/game/objects/uplinks.dm +++ b/code/game/objects/devices/uplinks.dm @@ -371,32 +371,6 @@ A list of items and costs is stored under the datum of every game mode, alongsid if(hidden_uplink) hidden_uplink.trigger(user) -/obj/item/weapon/implant/uplink - name = "uplink" - desc = "Summon things." - var/activation_emote = "chuckle" - -/obj/item/weapon/implant/uplink/New() - activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") - hidden_uplink = new(src) - hidden_uplink.uses = 5 - ..() - return - -// Moved the Uplink Implant here - -/obj/item/weapon/implant/uplink/implanted(mob/source) - activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") - source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0) - source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate." - return 1 - - -/obj/item/weapon/implant/uplink/trigger(emote, mob/source as mob) - if(hidden_uplink && usr == source) // Let's not have another people activate our uplink - hidden_uplink.check_trigger(source, emote, activation_emote) - return - /obj/item/device/radio/headset/uplink traitor_frequency = 1445 diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm new file mode 100644 index 00000000000..341b30c1699 --- /dev/null +++ b/code/game/objects/effects/aliens.dm @@ -0,0 +1,421 @@ +/* Alien Effects! + * Contains: + * effect/alien + * Resin + * Weeds + * Acid + * Egg + */ + +/* + * effect/alien + */ +/obj/effect/alien + name = "alien thing" + desc = "theres something alien about this" + icon = 'icons/mob/alien.dmi' +// unacidable = 1 //Aliens won't ment their own. + + +/* + * Resin + */ +/obj/effect/alien/resin + name = "resin" + desc = "Looks like some kind of slimy growth." + icon_state = "resin" + + density = 1 + opacity = 1 + anchored = 1 + var/health = 50 + //var/mob/living/affecting = null + + wall + name = "resin wall" + desc = "Purple slime solidified into a wall." + icon_state = "resinwall" //same as resin, but consistency ho! + + membrane + name = "resin membrane" + desc = "Purple slime just thin enough to let light pass through." + icon_state = "resinmembrane" + opacity = 0 + health = 20 + +/obj/effect/alien/resin/proc/healthcheck() + if(health <=0) + density = 0 + del(src) + return + +/obj/effect/alien/resin/bullet_act(var/obj/item/projectile/Proj) + health -= Proj.damage + ..() + healthcheck() + return + +/obj/effect/alien/resin/ex_act(severity) + switch(severity) + if(1.0) + health-=50 + if(2.0) + health-=50 + if(3.0) + if (prob(50)) + health-=50 + else + health-=25 + healthcheck() + return + +/obj/effect/alien/resin/blob_act() + health-=50 + healthcheck() + return + +/obj/effect/alien/resin/meteorhit() + health-=50 + healthcheck() + return + +/obj/effect/alien/resin/hitby(AM as mob|obj) + ..() + for(var/mob/O in viewers(src, null)) + O.show_message("\red [src] was hit by [AM].", 1) + var/tforce = 0 + if(ismob(AM)) + tforce = 10 + else + tforce = AM:throwforce + playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + health = max(0, health - tforce) + healthcheck() + ..() + return + +/obj/effect/alien/resin/attack_hand() + if ((HULK in usr.mutations) || (SUPRSTR in usr.augmentations)) + usr << "\blue You easily destroy the [name]." + for(var/mob/O in oviewers(src)) + O.show_message("\red [usr] destroys the [name]!", 1) + health = 0 + healthcheck() + return + +/obj/effect/alien/resin/attack_paw() + return attack_hand() + +/obj/effect/alien/resin/attack_alien() + if (islarva(usr))//Safety check for larva. /N + return + usr << "\green You claw at the [name]." + for(var/mob/O in oviewers(src)) + O.show_message("\red [usr] claws at the resin!", 1) + playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + health -= rand(10, 20) + if(health <= 0) + usr << "\green You slice the [name] to pieces." + for(var/mob/O in oviewers(src)) + O.show_message("\red [usr] slices the [name] apart!", 1) + healthcheck() + return + +/obj/effect/alien/resin/attackby(obj/item/weapon/W as obj, mob/user as mob) + /*if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) + var/obj/item/weapon/grab/G = W + if(isalien(user)&&(ishuman(G.affecting)||ismonkey(G.affecting))) + //Only aliens can stick humans and monkeys into resin walls. Also, the wall must not have a person inside already. + if(!affecting) + if(G.state<2) + user << "\red You need a better grip to do that!" + return + G.affecting.loc = src + G.affecting.paralysis = 10 + for(var/mob/O in viewers(world.view, src)) + if (O.client) + O << text("\green [] places [] in the resin wall!", G.assailant, G.affecting) + affecting=G.affecting + del(W) + spawn(0) + process() + else + user << "\red This wall is already occupied." + return */ + + var/aforce = W.force + health = max(0, health - aforce) + playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + healthcheck() + ..() + return + +/obj/effect/alien/resin/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(air_group) return 0 + if(istype(mover) && mover.checkpass(PASSGLASS)) + return !opacity + return !density + + +/* + * Weeds + */ +#define NODERANGE 3 + +/obj/effect/alien/weeds + name = "weeds" + desc = "Weird purple weeds." + icon_state = "weeds" + + anchored = 1 + density = 0 + var/health = 50 + + node + icon_state = "weednode" + name = "purple sac" + desc = "Weird purple octopus-like thing." + +/obj/effect/alien/weeds/New() + ..() + if(istype(loc, /turf/space)) + del(src) + return + if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2") + spawn(rand(150,300)) + if(src) + Life() + return + +/obj/effect/alien/weeds/node/New() + ..() + sd_SetLuminosity(NODERANGE) + return + +/obj/effect/alien/weeds/proc/Life() + set background = 1 + var/turf/U = get_turf(src) +/* + if (locate(/obj/movable, U)) + U = locate(/obj/movable, U) + if(U.density == 1) + del(src) + return + +Alien plants should do something if theres a lot of poison + if(U.poison> 200000) + health -= round(U.poison/200000) + update() + return +*/ + if (istype(U, /turf/space)) + del(src) + return + + direction_loop: + for(var/dirn in cardinal) + var/turf/T = get_step(src, dirn) + + if (!istype(T) || T.density || locate(/obj/effect/alien/weeds) in T || istype(T.loc, /area/arrival) || istype(T, /turf/space)) + continue + + if(!(locate(/obj/effect/alien/weeds/node) in view(NODERANGE,T))) + continue + + // if (locate(/obj/movable, T)) // don't propogate into movables + // continue + + for(var/obj/O in T) + if(O.density) + continue direction_loop + + new /obj/effect/alien/weeds(T) + + +/obj/effect/alien/weeds/ex_act(severity) + switch(severity) + if(1.0) + del(src) + if(2.0) + if (prob(50)) + del(src) + if(3.0) + if (prob(5)) + del(src) + return + +/obj/effect/alien/weeds/attackby(var/obj/item/weapon/W, var/mob/user) + if(W.attack_verb.len) + visible_message("\red \The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") + else + visible_message("\red \The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]") + + var/damage = W.force / 4.0 + + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + + if(WT.remove_fuel(0, user)) + damage = 15 + playsound(loc, 'sound/items/Welder.ogg', 100, 1) + + health -= damage + healthcheck() + +/obj/effect/alien/weeds/proc/healthcheck() + if(health <= 0) + del(src) + + +/obj/effect/alien/weeds/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature > 300) + health -= 5 + healthcheck() + +/*/obj/effect/alien/weeds/burn(fi_amount) + if (fi_amount > 18000) + spawn( 0 ) + del(src) + return + return 0 + return 1 +*/ + +#undef NODERANGE + + +/* + * Acid + */ +/obj/effect/alien/acid + name = "acid" + desc = "Burbling corrossive stuff. I wouldn't want to touch it." + icon_state = "acid" + + density = 0 + opacity = 0 + anchored = 1 + + var/obj/target + var/ticks = 0 + +/obj/effect/alien/acid/proc/tick() + ticks += 1 + for(var/mob/O in hearers(src, null)) + O.show_message("\green [src.target] sizzles and begins to melt under the bubbling mess of acid!", 1) + if(prob(ticks*10)) + for(var/mob/O in hearers(src, null)) + O.show_message("\green [src.target] collapses under its own weight into a puddle of goop and undigested debris!", 1) +// if(target.occupant) //I tried to fix mechas-with-humans-getting-deleted. Made them unacidable for now. +// target.ex_act(1) + del(target) + del(src) + return + spawn(rand(200, 600)) tick() + +/* + * Egg + */ +/var/const //for the status var + BURST = 0 + GROWING = 1 + GROWN = 2 + + MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger + MAX_GROWTH_TIME = 3000 + +/obj/effect/alien/egg + desc = "It looks like a weird egg" + name = "egg" + icon_state = "egg_growing" + density = 0 + anchored = 1 + + var/health = 100 + var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive + + New() + if(aliens_allowed) + ..() + spawn(rand(MIN_GROWTH_TIME,MAX_GROWTH_TIME)) + Grow() + else + del(src) + + attack_paw(user as mob) + if(isalien(user)) + switch(status) + if(BURST) + user << "\red The child is already gone." + return + if(GROWING) + user << "\red The child is not developed yet." + return + if(GROWN) + user << "\red You retrieve the child." + loc.contents += GetFacehugger()//need to write the code for giving it to the alien later + Burst() + return + else + return attack_hand(user) + + attack_hand(user as mob) + user << "It feels slimy." + return + + proc/GetFacehugger() + return locate(/obj/item/clothing/mask/facehugger) in contents + + proc/Grow() + icon_state = "egg" + status = GROWN + new /obj/item/clothing/mask/facehugger(src) + return + + proc/Burst() //drops and kills the hugger if any is remaining + var/obj/item/clothing/mask/facehugger/child = GetFacehugger() + + if(child) + loc.contents += child + child.Die() + + icon_state = "egg_hatched" + status = BURST + return + +/obj/effect/alien/egg/bullet_act(var/obj/item/projectile/Proj) + health -= Proj.damage + ..() + healthcheck() + return + + + +/obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user) + if(health <= 0) + return + if(W.attack_verb.len) + src.visible_message("\red \The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") + else + src.visible_message("\red \The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]") + var/damage = W.force / 4.0 + + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + + if(WT.remove_fuel(0, user)) + damage = 15 + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + + src.health -= damage + src.healthcheck() + + +/obj/effect/alien/egg/proc/healthcheck() + if(health <= 0) + Burst() + +/obj/effect/alien/egg/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature > 500) + health -= 5 + healthcheck() \ No newline at end of file diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm new file mode 100644 index 00000000000..8fbd21a4177 --- /dev/null +++ b/code/game/objects/effects/mines.dm @@ -0,0 +1,85 @@ +/obj/effect/mine/New() + icon_state = "uglyminearmed" + +/obj/effect/mine/HasEntered(AM as mob|obj) + Bumped(AM) + +/obj/effect/mine/Bumped(mob/M as mob|obj) + + if(triggered) return + + if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey)) + for(var/mob/O in viewers(world.view, src.loc)) + O << "[M] triggered the \icon[src] [src]" + triggered = 1 + call(src,triggerproc)(M) + +/obj/effect/mine/proc/triggerrad(obj) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + obj:radiation += 50 + randmutb(obj) + domutcheck(obj,null) + spawn(0) + del(src) + +/obj/effect/mine/proc/triggerstun(obj) + if(ismob(obj)) + var/mob/M = obj + M.Stun(30) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + spawn(0) + del(src) + +/obj/effect/mine/proc/triggern2o(obj) + //example: n2o triggerproc + //note: im lazy + + for (var/turf/simulated/floor/target in range(1,src)) + if(!target.blocks_air) + if(target.parent) + target.parent.suspend_group_processing() + + var/datum/gas_mixture/payload = new + var/datum/gas/sleeping_agent/trace_gas = new + + trace_gas.moles = 30 + payload += trace_gas + + target.air.merge(payload) + + spawn(0) + del(src) + +/obj/effect/mine/proc/triggerplasma(obj) + for (var/turf/simulated/floor/target in range(1,src)) + if(!target.blocks_air) + if(target.parent) + target.parent.suspend_group_processing() + + var/datum/gas_mixture/payload = new + + payload.toxins = 30 + + target.air.merge(payload) + + target.hotspot_expose(1000, CELL_VOLUME) + + spawn(0) + del(src) + +/obj/effect/mine/proc/triggerkick(obj) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + del(obj:client) + spawn(0) + del(src) + +/obj/effect/mine/proc/explode(obj) + explosion(loc, 0, 1, 2, 3) + spawn(0) + del(src) \ No newline at end of file diff --git a/code/game/objects/portals.dm b/code/game/objects/effects/portals.dm similarity index 100% rename from code/game/objects/portals.dm rename to code/game/objects/effects/portals.dm diff --git a/code/game/objects/sign_decals.dm b/code/game/objects/effects/signs.dm similarity index 100% rename from code/game/objects/sign_decals.dm rename to code/game/objects/effects/signs.dm diff --git a/code/game/objects/alien/facehugger.dm b/code/game/objects/facehugger.dm similarity index 94% rename from code/game/objects/alien/facehugger.dm rename to code/game/objects/facehugger.dm index 9a5cc518a28..9093ecba401 100644 --- a/code/game/objects/alien/facehugger.dm +++ b/code/game/objects/facehugger.dm @@ -1,5 +1,7 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 +//Moving this here for now.. it might end up in modules/mob/ later + var/const/MIN_IMPREGNATION_TIME = 100 //time it takes to impregnate someone var/const/MAX_IMPREGNATION_TIME = 150 diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm new file mode 100644 index 00000000000..2cba026e320 --- /dev/null +++ b/code/game/objects/items/weapons/implants/implantuplink.dm @@ -0,0 +1,23 @@ +/obj/item/weapon/implant/uplink + name = "uplink" + desc = "Summon things." + var/activation_emote = "chuckle" + +/obj/item/weapon/implant/uplink/New() + activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") + hidden_uplink = new(src) + hidden_uplink.uses = 5 + ..() + return + +/obj/item/weapon/implant/uplink/implanted(mob/source) + activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") + source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0) + source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate." + return 1 + + +/obj/item/weapon/implant/uplink/trigger(emote, mob/source as mob) + if(hidden_uplink && usr == source) // Let's not have another people activate our uplink + hidden_uplink.check_trigger(source, emote, activation_emote) + return \ No newline at end of file diff --git a/code/game/objects/items/weapons/mousetraps.dm b/code/game/objects/items/weapons/mousetraps.dm new file mode 100644 index 00000000000..4906f886a28 --- /dev/null +++ b/code/game/objects/items/weapons/mousetraps.dm @@ -0,0 +1,94 @@ +/obj/item/weapon/mousetrap/examine() + set src in oview(12) + ..() + if(armed) + usr << "\red It looks like it's armed." + +/obj/item/weapon/mousetrap/proc/triggered(mob/target as mob, var/type = "feet") + if(!armed) + return + var/datum/organ/external/affecting = null + if(ishuman(target)) + var/mob/living/carbon/human/H = target + switch(type) + if("feet") + if(!H.shoes) + affecting = H.get_organ(pick("l_leg", "r_leg")) + H.Weaken(3) + if("l_hand", "r_hand") + if(!H.gloves) + affecting = H.get_organ(type) + H.Stun(3) + if(affecting) + if(affecting.take_damage(1, 0)) + H.UpdateDamageIcon() + H.updatehealth() + else if(ismouse(target)) + var/mob/living/simple_animal/mouse/M = target + src.visible_message("\red SPLAT!") + M.splat() + playsound(target.loc, 'sound/effects/snap.ogg', 50, 1) + icon_state = "mousetrap" + armed = 0 +/* + else if (ismouse(target)) + target.adjustBruteLoss(100) +*/ + +/obj/item/weapon/mousetrap/attack_self(mob/living/user as mob) + if(!armed) + icon_state = "mousetraparmed" + user << "\blue You arm the mousetrap." + else + icon_state = "mousetrap" + if(( (user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50))) + var/which_hand = "l_hand" + if(!user.hand) + which_hand = "r_hand" + src.triggered(user, which_hand) + user << "\red You accidentally trigger the mousetrap!" + for(var/mob/O in viewers(user, null)) + if(O == user) + continue + O.show_message("\red [user] accidentally sets off the mousetrap, breaking their fingers.", 1) + return + user << "\blue You disarm the mousetrap." + armed = !armed + playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) + +/obj/item/weapon/mousetrap/attack_hand(mob/living/user as mob) + if(armed) + if(( (user.getBrainLoss() >= 60 || CLUMSY in user.mutations)) && prob(50)) + var/which_hand = "l_hand" + if(!user.hand) + which_hand = "r_hand" + src.triggered(user, which_hand) + user << "\red You accidentally trigger the mousetrap!" + for(var/mob/O in viewers(user, null)) + if(O == user) + continue + O.show_message("\red [user] accidentally sets off the mousetrap, breaking their fingers.", 1) + return + ..() + +/obj/item/weapon/mousetrap/HasEntered(AM as mob|obj) + if(armed) + if(ishuman(AM)) + var/mob/living/carbon/H = AM + if(H.m_intent == "run") + src.triggered(H) + H << "\red You accidentally step on the mousetrap!" + for(var/mob/O in viewers(H, null)) + if(O == H) + continue + O.show_message("\red [H] accidentally steps on the mousetrap.", 1) + if(ismouse(AM)) + triggered(AM) + ..() + +/obj/item/weapon/mousetrap/hitby(A as mob|obj) + if(!armed) + return ..() + for(var/mob/O in viewers(src, null)) + O.show_message("\red The mousetrap is triggered by [A].", 1) + src.triggered(null) diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index b23050d0e0d..27663d4309a 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -1,5 +1,6 @@ /* CONTAINS: +BANHAMMER SWORD BLADE AXE @@ -7,8 +8,10 @@ CLASSIC BATON ENERGY SHIELD (where else should i even put this) */ - - +//BANHAMMER +/obj/item/weapon/banhammer/attack(mob/M as mob, mob/user as mob) + M << " You have been banned FOR NO REISIN by [user]" + user << " You have BANNED [M]" // SWORD /obj/item/weapon/melee/energy/sword/IsShield() diff --git a/code/game/objects/shooting_range.dm b/code/game/objects/shooting_range.dm index c3717141b8c..94310b70fb9 100644 --- a/code/game/objects/shooting_range.dm +++ b/code/game/objects/shooting_range.dm @@ -1,61 +1,3 @@ - -// TARGET STAKE -// TARGET -// Basically they are for the firing range -/obj/structure/target_stake - name = "target stake" - desc = "A thin platform with negatively-magnetized wheels." - icon = 'icons/obj/objects.dmi' - icon_state = "target_stake" - density = 1 - flags = CONDUCT - var/obj/item/target/pinned_target // the current pinned target - - Move() - ..() - // Move the pinned target along with the stake - if(pinned_target in view(3, src)) - pinned_target.loc = loc - - else // Sanity check: if the pinned target can't be found in immediate view - pinned_target = null - density = 1 - - attackby(obj/item/W as obj, mob/user as mob) - // Putting objects on the stake. Most importantly, targets - if(pinned_target) - return // get rid of that pinned target first! - - if(istype(W, /obj/item/target)) - density = 0 - W.density = 1 - user.drop_item(src) - W.loc = loc - W.layer = 3.1 - pinned_target = W - user << "You slide the target into the stake." - return - - attack_hand(mob/user as mob) - // taking pinned targets off! - if(pinned_target) - density = 1 - pinned_target.density = 0 - pinned_target.layer = OBJ_LAYER - - pinned_target.loc = user.loc - if(ishuman(user)) - if(!user.get_active_hand()) - user.put_in_hands(pinned_target) - user << "You take the target out of the stake." - else - pinned_target.loc = get_turf_loc(user) - user << "You take the target out of the stake." - - pinned_target = null - - - // Targets, the things that actually get shot! /obj/item/target name = "shooting target" @@ -236,14 +178,4 @@ b2y1 = pixel_y + pick(1,1,1,1,2,2,3,3,4) b2y2 = pixel_y - pick(1,1,1,1,2,2,3,3,4) - Target.bulletholes.Add(src) - - - - - - - - - - + Target.bulletholes.Add(src) \ No newline at end of file diff --git a/code/game/objects/alien/nest.dm b/code/game/objects/structures/aliennests.dm similarity index 100% rename from code/game/objects/alien/nest.dm rename to code/game/objects/structures/aliennests.dm diff --git a/code/game/objects/structures/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm similarity index 100% rename from code/game/objects/structures/closets.dm rename to code/game/objects/structures/crates_lockers/closets.dm diff --git a/code/game/objects/closets/bombsuit.dm b/code/game/objects/structures/crates_lockers/closets/bombsuit.dm similarity index 100% rename from code/game/objects/closets/bombsuit.dm rename to code/game/objects/structures/crates_lockers/closets/bombsuit.dm diff --git a/code/game/objects/closets/emergency.dm b/code/game/objects/structures/crates_lockers/closets/emergency.dm similarity index 100% rename from code/game/objects/closets/emergency.dm rename to code/game/objects/structures/crates_lockers/closets/emergency.dm diff --git a/code/game/objects/closets/extinguisher.dm b/code/game/objects/structures/crates_lockers/closets/extinguisher.dm similarity index 100% rename from code/game/objects/closets/extinguisher.dm rename to code/game/objects/structures/crates_lockers/closets/extinguisher.dm diff --git a/code/game/objects/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm similarity index 100% rename from code/game/objects/closets/fireaxe.dm rename to code/game/objects/structures/crates_lockers/closets/fireaxe.dm diff --git a/code/game/objects/closets/firecloset.dm b/code/game/objects/structures/crates_lockers/closets/firecloset.dm similarity index 100% rename from code/game/objects/closets/firecloset.dm rename to code/game/objects/structures/crates_lockers/closets/firecloset.dm diff --git a/code/game/objects/closets/fitnesscloset.dm b/code/game/objects/structures/crates_lockers/closets/fitnesscloset.dm similarity index 100% rename from code/game/objects/closets/fitnesscloset.dm rename to code/game/objects/structures/crates_lockers/closets/fitnesscloset.dm diff --git a/code/game/objects/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm similarity index 100% rename from code/game/objects/closets/gimmick.dm rename to code/game/objects/structures/crates_lockers/closets/gimmick.dm diff --git a/code/game/objects/closets/gmcloset.dm b/code/game/objects/structures/crates_lockers/closets/gmcloset.dm similarity index 100% rename from code/game/objects/closets/gmcloset.dm rename to code/game/objects/structures/crates_lockers/closets/gmcloset.dm diff --git a/code/game/objects/closets/janitor.dm b/code/game/objects/structures/crates_lockers/closets/janitor.dm similarity index 100% rename from code/game/objects/closets/janitor.dm rename to code/game/objects/structures/crates_lockers/closets/janitor.dm diff --git a/code/game/objects/closets/kitchen.dm b/code/game/objects/structures/crates_lockers/closets/kitchen.dm similarity index 100% rename from code/game/objects/closets/kitchen.dm rename to code/game/objects/structures/crates_lockers/closets/kitchen.dm diff --git a/code/game/objects/closets/l3closet.dm b/code/game/objects/structures/crates_lockers/closets/l3closet.dm similarity index 100% rename from code/game/objects/closets/l3closet.dm rename to code/game/objects/structures/crates_lockers/closets/l3closet.dm diff --git a/code/game/objects/closets/malfunction.dm b/code/game/objects/structures/crates_lockers/closets/malfunction.dm similarity index 100% rename from code/game/objects/closets/malfunction.dm rename to code/game/objects/structures/crates_lockers/closets/malfunction.dm diff --git a/code/game/objects/closets/nuclear.dm b/code/game/objects/structures/crates_lockers/closets/nuclear.dm similarity index 100% rename from code/game/objects/closets/nuclear.dm rename to code/game/objects/structures/crates_lockers/closets/nuclear.dm diff --git a/code/game/objects/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm similarity index 100% rename from code/game/objects/closets/secure/bar.dm rename to code/game/objects/structures/crates_lockers/closets/secure/bar.dm diff --git a/code/game/objects/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm similarity index 100% rename from code/game/objects/closets/secure/cargo.dm rename to code/game/objects/structures/crates_lockers/closets/secure/cargo.dm diff --git a/code/game/objects/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm similarity index 100% rename from code/game/objects/closets/secure/engineering.dm rename to code/game/objects/structures/crates_lockers/closets/secure/engineering.dm diff --git a/code/game/objects/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm similarity index 100% rename from code/game/objects/closets/secure/hydroponics.dm rename to code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm diff --git a/code/game/objects/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm similarity index 100% rename from code/game/objects/closets/secure/medical.dm rename to code/game/objects/structures/crates_lockers/closets/secure/medical.dm diff --git a/code/game/objects/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm similarity index 100% rename from code/game/objects/closets/secure/personal.dm rename to code/game/objects/structures/crates_lockers/closets/secure/personal.dm diff --git a/code/game/objects/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm similarity index 100% rename from code/game/objects/closets/secure/scientist.dm rename to code/game/objects/structures/crates_lockers/closets/secure/scientist.dm diff --git a/code/game/objects/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm similarity index 100% rename from code/game/objects/closets/secure/secure_closets.dm rename to code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm diff --git a/code/game/objects/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm similarity index 100% rename from code/game/objects/closets/secure/security.dm rename to code/game/objects/structures/crates_lockers/closets/secure/security.dm diff --git a/code/game/objects/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm similarity index 100% rename from code/game/objects/closets/syndicate.dm rename to code/game/objects/structures/crates_lockers/closets/syndicate.dm diff --git a/code/game/objects/closets/thunderdome.dm b/code/game/objects/structures/crates_lockers/closets/thunderdome.dm similarity index 100% rename from code/game/objects/closets/thunderdome.dm rename to code/game/objects/structures/crates_lockers/closets/thunderdome.dm diff --git a/code/game/objects/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm similarity index 100% rename from code/game/objects/closets/wardrobe.dm rename to code/game/objects/structures/crates_lockers/closets/wardrobe.dm diff --git a/code/game/objects/structures/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm similarity index 100% rename from code/game/objects/structures/crates.dm rename to code/game/objects/structures/crates_lockers/crates.dm diff --git a/code/game/objects/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm similarity index 100% rename from code/game/objects/largecrate.dm rename to code/game/objects/structures/crates_lockers/largecrate.dm diff --git a/code/game/objects/grille.dm b/code/game/objects/structures/grille.dm similarity index 100% rename from code/game/objects/grille.dm rename to code/game/objects/structures/grille.dm diff --git a/code/game/objects/kitchen.dm b/code/game/objects/structures/kitchen_spike.dm similarity index 100% rename from code/game/objects/kitchen.dm rename to code/game/objects/structures/kitchen_spike.dm diff --git a/code/game/objects/ladders.dm b/code/game/objects/structures/ladders.dm similarity index 100% rename from code/game/objects/ladders.dm rename to code/game/objects/structures/ladders.dm diff --git a/code/game/objects/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm similarity index 100% rename from code/game/objects/mineral_doors.dm rename to code/game/objects/structures/mineral_doors.dm diff --git a/code/game/objects/noticeboard.dm b/code/game/objects/structures/noticeboard.dm similarity index 100% rename from code/game/objects/noticeboard.dm rename to code/game/objects/structures/noticeboard.dm diff --git a/code/game/objects/stool.dm b/code/game/objects/structures/stool_chair_bed.dm similarity index 100% rename from code/game/objects/stool.dm rename to code/game/objects/structures/stool_chair_bed.dm diff --git a/code/game/objects/tables_racks.dm b/code/game/objects/structures/tables_racks.dm similarity index 100% rename from code/game/objects/tables_racks.dm rename to code/game/objects/structures/tables_racks.dm diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm new file mode 100644 index 00000000000..1e9ac37a558 --- /dev/null +++ b/code/game/objects/structures/target_stake.dm @@ -0,0 +1,52 @@ +// Basically they are for the firing range +/obj/structure/target_stake + name = "target stake" + desc = "A thin platform with negatively-magnetized wheels." + icon = 'icons/obj/objects.dmi' + icon_state = "target_stake" + density = 1 + flags = CONDUCT + var/obj/item/target/pinned_target // the current pinned target + + Move() + ..() + // Move the pinned target along with the stake + if(pinned_target in view(3, src)) + pinned_target.loc = loc + + else // Sanity check: if the pinned target can't be found in immediate view + pinned_target = null + density = 1 + + attackby(obj/item/W as obj, mob/user as mob) + // Putting objects on the stake. Most importantly, targets + if(pinned_target) + return // get rid of that pinned target first! + + if(istype(W, /obj/item/target)) + density = 0 + W.density = 1 + user.drop_item(src) + W.loc = loc + W.layer = 3.1 + pinned_target = W + user << "You slide the target into the stake." + return + + attack_hand(mob/user as mob) + // taking pinned targets off! + if(pinned_target) + density = 1 + pinned_target.density = 0 + pinned_target.layer = OBJ_LAYER + + pinned_target.loc = user.loc + if(ishuman(user)) + if(!user.get_active_hand()) + user.put_in_hands(pinned_target) + user << "You take the target out of the stake." + else + pinned_target.loc = get_turf_loc(user) + user << "You take the target out of the stake." + + pinned_target = null \ No newline at end of file diff --git a/code/game/objects/watercloset.dm b/code/game/objects/structures/watercloset.dm similarity index 100% rename from code/game/objects/watercloset.dm rename to code/game/objects/structures/watercloset.dm diff --git a/code/game/objects/tanks/oxygen.dm b/code/game/objects/tanks/oxygen.dm deleted file mode 100644 index fdf86cd29a0..00000000000 --- a/code/game/objects/tanks/oxygen.dm +++ /dev/null @@ -1,32 +0,0 @@ - -/obj/item/weapon/tank/oxygen - name = "Gas Tank (Oxygen)" - desc = "A tank of oxygen" - icon_state = "oxygen" - distribute_pressure = ONE_ATMOSPHERE*O2STANDARD - - - New() - ..() - src.air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return - - - examine() - set src in usr - ..() - if(air_contents.oxygen < 10) - usr << text("\red The meter on the [src.name] indicates you are almost out of air!") - playsound(usr, 'sound/effects/alert.ogg', 50, 1) - - -/obj/item/weapon/tank/oxygen/yellow - name = "Gas Tank (Oxygen)" - desc = "A tank of oxygen, this one is yellow." - icon_state = "oxygen_f" - - -/obj/item/weapon/tank/oxygen/red - name = "Gas Tank (Oxygen)" - desc = "A tank of oxygen, this one is red." - icon_state = "oxygen_fr" diff --git a/code/game/objects/tanks/tank_types.dm b/code/game/objects/tanks/tank_types.dm new file mode 100644 index 00000000000..3cfb89a3069 --- /dev/null +++ b/code/game/objects/tanks/tank_types.dm @@ -0,0 +1,151 @@ +/* Types of tanks! + * Contains: + * Oxygen + * Anesthetic + * Air + * Plasma + */ + +/* + * Oxygen + */ +/obj/item/weapon/tank/oxygen + name = "Gas Tank (Oxygen)" + desc = "A tank of oxygen" + icon_state = "oxygen" + distribute_pressure = ONE_ATMOSPHERE*O2STANDARD + + + New() + ..() + src.air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + return + + + examine() + set src in usr + ..() + if(air_contents.oxygen < 10) + usr << text("\red The meter on the [src.name] indicates you are almost out of air!") + playsound(usr, 'sound/effects/alert.ogg', 50, 1) + + +/obj/item/weapon/tank/oxygen/yellow + name = "Gas Tank (Oxygen)" + desc = "A tank of oxygen, this one is yellow." + icon_state = "oxygen_f" + +/obj/item/weapon/tank/oxygen/red + name = "Gas Tank (Oxygen)" + desc = "A tank of oxygen, this one is red." + icon_state = "oxygen_fr" + + +/* + * Anesthetic + */ +/obj/item/weapon/tank/anesthetic + name = "Gas Tank (Sleeping Agent)" + desc = "A N2O/O2 gas mix" + icon_state = "anesthetic" + item_state = "an_tank" + +/obj/item/weapon/tank/anesthetic/New() + ..() + + src.air_contents.oxygen = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD + + var/datum/gas/sleeping_agent/trace_gas = new() + trace_gas.moles = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD + + src.air_contents.trace_gases += trace_gas + return + +/* + * Air + */ +/obj/item/weapon/tank/air + name = "Gas Tank (Air Mix)" + desc = "Mixed anyone?" + icon_state = "oxygen" + + + examine() + set src in usr + ..() + if(air_contents.oxygen < 1 && loc==usr) + usr << "\red The meter on the [src.name] indicates you are almost out of air!" + usr << sound('sound/effects/alert.ogg') + +/obj/item/weapon/tank/air/New() + ..() + + src.air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD + src.air_contents.nitrogen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD + return + + +/* + * Plasma + */ +/obj/item/weapon/tank/plasma + name = "Gas Tank (BIOHAZARD)" + desc = "Contains dangerous plasma. Do not inhale." + icon_state = "plasma" + flags = FPRINT | TABLEPASS | CONDUCT + slot_flags = null //they have no straps! + + +/obj/item/weapon/tank/plasma/New() + ..() + + src.air_contents.toxins = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C) + return + + +/obj/item/weapon/tank/plasma/proc/release() + var/datum/gas_mixture/removed = air_contents.remove(air_contents.total_moles()) + + loc.assume_air(removed) + +/obj/item/weapon/tank/plasma/proc/ignite() + var/fuel_moles = air_contents.toxins + air_contents.oxygen/6 + var/strength = 1 + + var/turf/ground_zero = get_turf(loc) + loc = null + + if(air_contents.temperature > (T0C + 400)) + strength = fuel_moles/15 + + explosion(ground_zero, strength, strength*2, strength*3, strength*4) + + else if(air_contents.temperature > (T0C + 250)) + strength = fuel_moles/20 + + explosion(ground_zero, 0, strength, strength*2, strength*3) + + else if(air_contents.temperature > (T0C + 100)) + strength = fuel_moles/25 + + explosion(ground_zero, 0, 0, strength, strength*3) + + else + ground_zero.assume_air(air_contents) + ground_zero.hotspot_expose(1000, 125) + + if(src.master) + del(src.master) + del(src) + +/obj/item/weapon/tank/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob) + ..() + + if (istype(W, /obj/item/weapon/flamethrower)) + var/obj/item/weapon/flamethrower/F = W + if ((!F.status)||(F.ptank)) return + src.master = F + F.ptank = src + user.before_take_item(src) + src.loc = F + return diff --git a/code/game/objects/tank.dm b/code/game/objects/tanks/tanks.dm similarity index 50% rename from code/game/objects/tank.dm rename to code/game/objects/tanks/tanks.dm index 2544bf75a81..aa785fc41f2 100644 --- a/code/game/objects/tank.dm +++ b/code/game/objects/tanks/tanks.dm @@ -1,10 +1,6 @@ - /obj/item/weapon/tank name = "tank" icon = 'icons/obj/tank.dmi' - - var/datum/gas_mixture/air_contents = null - var/distribute_pressure = ONE_ATMOSPHERE flags = FPRINT | TABLEPASS | CONDUCT slot_flags = SLOT_BACK @@ -14,37 +10,58 @@ throwforce = 10.0 throw_speed = 1 throw_range = 4 + + var/datum/gas_mixture/air_contents = null + var/distribute_pressure = ONE_ATMOSPHERE + var/integrity = 3 var/volume = 70 +/obj/item/weapon/tank/New() + ..() -/obj/item/weapon/tank/anesthetic - name = "Gas Tank (Sleeping Agent)" - desc = "A N2O/O2 gas mix" - icon_state = "anesthetic" - item_state = "an_tank" + src.air_contents = new /datum/gas_mixture() + src.air_contents.volume = volume //liters + src.air_contents.temperature = T20C + processing_objects.Add(src) + return -/obj/item/weapon/tank/air - name = "Gas Tank (Air Mix)" - desc = "Mixed anyone?" - icon_state = "oxygen" +/obj/item/weapon/tank/Del() + if(air_contents) + del(air_contents) + processing_objects.Remove(src) - examine() - set src in usr - ..() - if(air_contents.oxygen < 1 && loc==usr) - usr << "\red The meter on the [src.name] indicates you are almost out of air!" - usr << sound('sound/effects/alert.ogg') + ..() +/obj/item/weapon/tank/examine() + var/obj/icon = src + if (istype(src.loc, /obj/item/assembly)) + icon = src.loc + if (!in_range(src, usr)) + if (icon == src) usr << "\blue It's \a \icon[icon][src]! If you want any more information you'll need to get closer." + return -/obj/item/weapon/tank/plasma - name = "Gas Tank (BIOHAZARD)" - desc = "Contains dangerous plasma. Do not inhale." - icon_state = "plasma" - flags = FPRINT | TABLEPASS | CONDUCT - slot_flags = null //they have no straps! + var/celsius_temperature = src.air_contents.temperature-T0C + var/descriptive + + if (celsius_temperature < 20) + descriptive = "cold" + else if (celsius_temperature < 40) + descriptive = "room temperature" + else if (celsius_temperature < 80) + descriptive = "lukewarm" + else if (celsius_temperature < 100) + descriptive = "warm" + else if (celsius_temperature < 300) + descriptive = "hot" + else + descriptive = "furiously hot" + + usr << "\blue \The \icon[icon][src] feels [descriptive]" + + return /obj/item/weapon/tank/blob_act() if(prob(50)) @@ -57,6 +74,47 @@ del(src) +/obj/item/weapon/tank/attackby(obj/item/weapon/W as obj, mob/user as mob) + ..() + var/obj/icon = src + if (istype(src.loc, /obj/item/assembly)) + icon = src.loc + if ((istype(W, /obj/item/device/analyzer) || (istype(W, /obj/item/device/pda))) && get_dist(user, src) <= 1) + + for (var/mob/O in viewers(user, null)) + O << "\red [user] has used [W] on \icon[icon] [src]" + + var/pressure = air_contents.return_pressure() + + var/total_moles = air_contents.total_moles() + + user << "\blue Results of analysis of \icon[icon]" + if (total_moles>0) + var/o2_concentration = air_contents.oxygen/total_moles + var/n2_concentration = air_contents.nitrogen/total_moles + var/co2_concentration = air_contents.carbon_dioxide/total_moles + var/plasma_concentration = air_contents.toxins/total_moles + + var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration) + + user << "\blue Pressure: [round(pressure,0.1)] kPa" + user << "\blue Nitrogen: [round(n2_concentration*100)]%" + user << "\blue Oxygen: [round(o2_concentration*100)]%" + user << "\blue CO2: [round(co2_concentration*100)]%" + user << "\blue Plasma: [round(plasma_concentration*100)]%" + if(unknown_concentration>0.01) + user << "\red Unknown: [round(unknown_concentration*100)]%" + user << "\blue Temperature: [round(air_contents.temperature-T0C)]°C" + else + user << "\blue Tank is empty!" + src.add_fingerprint(user) + else if (istype(W,/obj/item/latexballon)) + var/obj/item/latexballon/LB = W + LB.blow(src) + src.add_fingerprint(user) + return + + /obj/item/weapon/tank/attack_self(mob/user as mob) if (!(src.air_contents)) return @@ -120,243 +178,79 @@ return return -/obj/item/weapon/tank - remove_air(amount) - return air_contents.remove(amount) - return_air() - return air_contents +/obj/item/weapon/tank/remove_air(amount) + return air_contents.remove(amount) - assume_air(datum/gas_mixture/giver) - air_contents.merge(giver) +/obj/item/weapon/tank/return_air() + return air_contents - check_status() - return 1 +/obj/item/weapon/tank/assume_air(datum/gas_mixture/giver) + air_contents.merge(giver) - proc/remove_air_volume(volume_to_return) - if(!air_contents) - return null + check_status() + return 1 - var/tank_pressure = air_contents.return_pressure() - if(tank_pressure < distribute_pressure) - distribute_pressure = tank_pressure +/obj/item/weapon/tank/proc/remove_air_volume(volume_to_return) + if(!air_contents) + return null - var/moles_needed = distribute_pressure*volume_to_return/(R_IDEAL_GAS_EQUATION*air_contents.temperature) + var/tank_pressure = air_contents.return_pressure() + if(tank_pressure < distribute_pressure) + distribute_pressure = tank_pressure - return remove_air(moles_needed) + var/moles_needed = distribute_pressure*volume_to_return/(R_IDEAL_GAS_EQUATION*air_contents.temperature) - process() - //Allow for reactions + return remove_air(moles_needed) + +/obj/item/weapon/tank/process() + //Allow for reactions + air_contents.react() + check_status() + + +/obj/item/weapon/tank/proc/check_status() + //Handle exploding, leaking, and rupturing of the tank + + if(!air_contents) + return 0 + + var/pressure = air_contents.return_pressure() + if(pressure > TANK_FRAGMENT_PRESSURE) + if(!istype(src.loc,/obj/item/device/transfer_valve)) + message_admins("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].") + log_game("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].") + //world << "\blue[x],[y] tank is exploding: [pressure] kPa" + //Give the gas a chance to build up more pressure through reacting air_contents.react() + air_contents.react() + air_contents.react() + pressure = air_contents.return_pressure() + var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE + range = min(range, MAX_EXPLOSION_RANGE) // was 8 - - - Changed to a configurable define -- TLE + var/turf/epicenter = get_turf(loc) - check_status() + //world << "\blue Exploding Pressure: [pressure] kPa, intensity: [range]" - var/integrity = 3 - proc/check_status() - //Handle exploding, leaking, and rupturing of the tank + explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5)) + del(src) - if(!air_contents) - return 0 - - var/pressure = air_contents.return_pressure() - if(pressure > TANK_FRAGMENT_PRESSURE) - if(!istype(src.loc,/obj/item/device/transfer_valve)) - message_admins("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].") - log_game("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].") - //world << "\blue[x],[y] tank is exploding: [pressure] kPa" - //Give the gas a chance to build up more pressure through reacting - air_contents.react() - air_contents.react() - air_contents.react() - pressure = air_contents.return_pressure() - - var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE - range = min(range, MAX_EXPLOSION_RANGE) // was 8 - - - Changed to a configurable define -- TLE - var/turf/epicenter = get_turf(loc) - - //world << "\blue Exploding Pressure: [pressure] kPa, intensity: [range]" - - explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5)) + else if(pressure > TANK_RUPTURE_PRESSURE) + //world << "\blue[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]" + if(integrity <= 0) + loc.assume_air(air_contents) + playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3) del(src) - - else if(pressure > TANK_RUPTURE_PRESSURE) - //world << "\blue[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]" - if(integrity <= 0) - loc.assume_air(air_contents) - playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3) - del(src) - else - integrity-- - - else if(pressure > TANK_LEAK_PRESSURE) - //world << "\blue[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]" - if(integrity <= 0) - var/datum/gas_mixture/leaked_gas = air_contents.remove_ratio(0.25) - loc.assume_air(leaked_gas) - else - integrity-- - - else if(integrity < 3) - integrity++ - - -/obj/item/weapon/tank/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - var/obj/icon = src - if (istype(src.loc, /obj/item/assembly)) - icon = src.loc - if ((istype(W, /obj/item/device/analyzer) || (istype(W, /obj/item/device/pda))) && get_dist(user, src) <= 1) - - for (var/mob/O in viewers(user, null)) - O << "\red [user] has used [W] on \icon[icon] [src]" - - var/pressure = air_contents.return_pressure() - - var/total_moles = air_contents.total_moles() - - user << "\blue Results of analysis of \icon[icon]" - if (total_moles>0) - var/o2_concentration = air_contents.oxygen/total_moles - var/n2_concentration = air_contents.nitrogen/total_moles - var/co2_concentration = air_contents.carbon_dioxide/total_moles - var/plasma_concentration = air_contents.toxins/total_moles - - var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration) - - user << "\blue Pressure: [round(pressure,0.1)] kPa" - user << "\blue Nitrogen: [round(n2_concentration*100)]%" - user << "\blue Oxygen: [round(o2_concentration*100)]%" - user << "\blue CO2: [round(co2_concentration*100)]%" - user << "\blue Plasma: [round(plasma_concentration*100)]%" - if(unknown_concentration>0.01) - user << "\red Unknown: [round(unknown_concentration*100)]%" - user << "\blue Temperature: [round(air_contents.temperature-T0C)]°C" else - user << "\blue Tank is empty!" - src.add_fingerprint(user) - else if (istype(W,/obj/item/latexballon)) - var/obj/item/latexballon/LB = W - LB.blow(src) - src.add_fingerprint(user) - return + integrity-- -/obj/item/weapon/tank/New() - ..() + else if(pressure > TANK_LEAK_PRESSURE) + //world << "\blue[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]" + if(integrity <= 0) + var/datum/gas_mixture/leaked_gas = air_contents.remove_ratio(0.25) + loc.assume_air(leaked_gas) + else + integrity-- - src.air_contents = new /datum/gas_mixture() - src.air_contents.volume = volume //liters - src.air_contents.temperature = T20C - - processing_objects.Add(src) - - return - -/obj/item/weapon/tank/Del() - if(air_contents) - del(air_contents) - - processing_objects.Remove(src) - - ..() - -/obj/item/weapon/tank/examine() - var/obj/icon = src - if (istype(src.loc, /obj/item/assembly)) - icon = src.loc - if (!in_range(src, usr)) - if (icon == src) usr << "\blue It's \a \icon[icon][src]! If you want any more information you'll need to get closer." - return - - var/celsius_temperature = src.air_contents.temperature-T0C - var/descriptive - - if (celsius_temperature < 20) - descriptive = "cold" - else if (celsius_temperature < 40) - descriptive = "room temperature" - else if (celsius_temperature < 80) - descriptive = "lukewarm" - else if (celsius_temperature < 100) - descriptive = "warm" - else if (celsius_temperature < 300) - descriptive = "hot" - else - descriptive = "furiously hot" - - usr << "\blue \The \icon[icon][src] feels [descriptive]" - - return - -/obj/item/weapon/tank/air/New() - ..() - - src.air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD - src.air_contents.nitrogen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD - return - - -/obj/item/weapon/tank/anesthetic/New() - ..() - - src.air_contents.oxygen = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD - - var/datum/gas/sleeping_agent/trace_gas = new() - trace_gas.moles = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD - - src.air_contents.trace_gases += trace_gas - return - -/obj/item/weapon/tank/plasma/New() - ..() - - src.air_contents.toxins = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C) - return - - -/obj/item/weapon/tank/plasma/proc/release() - var/datum/gas_mixture/removed = air_contents.remove(air_contents.total_moles()) - - loc.assume_air(removed) - -/obj/item/weapon/tank/plasma/proc/ignite() - var/fuel_moles = air_contents.toxins + air_contents.oxygen/6 - var/strength = 1 - - var/turf/ground_zero = get_turf(loc) - loc = null - - if(air_contents.temperature > (T0C + 400)) - strength = fuel_moles/15 - - explosion(ground_zero, strength, strength*2, strength*3, strength*4) - - else if(air_contents.temperature > (T0C + 250)) - strength = fuel_moles/20 - - explosion(ground_zero, 0, strength, strength*2, strength*3) - - else if(air_contents.temperature > (T0C + 100)) - strength = fuel_moles/25 - - explosion(ground_zero, 0, 0, strength, strength*3) - - else - ground_zero.assume_air(air_contents) - ground_zero.hotspot_expose(1000, 125) - - if(src.master) - del(src.master) - del(src) - -/obj/item/weapon/tank/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob) - - ..() -// PantsNote: More flamethrower assembly code. WOO! - if (istype(W, /obj/item/weapon/flamethrower)) - var/obj/item/weapon/flamethrower/F = W - if ((!F.status)||(F.ptank)) return - src.master = F - F.ptank = src - user.before_take_item(src) - src.loc = F - return + else if(integrity < 3) + integrity++ \ No newline at end of file diff --git a/code/game/objects/weapons.dm b/code/game/objects/weapons.dm index 8df8ecabfe2..c5c738c9c84 100644 --- a/code/game/objects/weapons.dm +++ b/code/game/objects/weapons.dm @@ -1,95 +1,4 @@ -//Banhammer deserves to be the first thing here - -/obj/item/weapon/banhammer/attack(mob/M as mob, mob/user as mob) - M << " You have been banned FOR NO REISIN by [user]" - user << " You have BANNED [M]" - -/obj/effect/mine/proc/triggerrad(obj) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - obj:radiation += 50 - randmutb(obj) - domutcheck(obj,null) - spawn(0) - del(src) - -/obj/effect/mine/proc/triggerstun(obj) - if(ismob(obj)) - var/mob/M = obj - M.Stun(30) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - spawn(0) - del(src) - -/obj/effect/mine/proc/triggern2o(obj) - //example: n2o triggerproc - //note: im lazy - - for (var/turf/simulated/floor/target in range(1,src)) - if(!target.blocks_air) - if(target.parent) - target.parent.suspend_group_processing() - - var/datum/gas_mixture/payload = new - var/datum/gas/sleeping_agent/trace_gas = new - - trace_gas.moles = 30 - payload += trace_gas - - target.air.merge(payload) - - spawn(0) - del(src) - -/obj/effect/mine/proc/triggerplasma(obj) - for (var/turf/simulated/floor/target in range(1,src)) - if(!target.blocks_air) - if(target.parent) - target.parent.suspend_group_processing() - - var/datum/gas_mixture/payload = new - - payload.toxins = 30 - - target.air.merge(payload) - - target.hotspot_expose(1000, CELL_VOLUME) - - spawn(0) - del(src) - -/obj/effect/mine/proc/triggerkick(obj) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - del(obj:client) - spawn(0) - del(src) - -/obj/effect/mine/proc/explode(obj) - explosion(loc, 0, 1, 2, 3) - spawn(0) - del(src) - - -/obj/effect/mine/HasEntered(AM as mob|obj) - Bumped(AM) - -/obj/effect/mine/Bumped(mob/M as mob|obj) - - if(triggered) return - - if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey)) - for(var/mob/O in viewers(world.view, src.loc)) - O << "[M] triggered the \icon[src] [src]" - triggered = 1 - call(src,triggerproc)(M) - -/obj/effect/mine/New() - icon_state = "uglyminearmed" +//TODO: Move these into atom_procs.dm after carn's finished with it, otherwise it'll conflict - Nodrak /atom/proc/ex_act() return @@ -114,99 +23,4 @@ if (I) I.hit() return - return - -/obj/item/weapon/mousetrap/examine() - set src in oview(12) - ..() - if(armed) - usr << "\red It looks like it's armed." - -/obj/item/weapon/mousetrap/proc/triggered(mob/target as mob, var/type = "feet") - if(!armed) - return - var/datum/organ/external/affecting = null - if(ishuman(target)) - var/mob/living/carbon/human/H = target - switch(type) - if("feet") - if(!H.shoes) - affecting = H.get_organ(pick("l_leg", "r_leg")) - H.Weaken(3) - if("l_hand", "r_hand") - if(!H.gloves) - affecting = H.get_organ(type) - H.Stun(3) - if(affecting) - if(affecting.take_damage(1, 0)) - H.UpdateDamageIcon() - H.updatehealth() - else if(ismouse(target)) - var/mob/living/simple_animal/mouse/M = target - src.visible_message("\red SPLAT!") - M.splat() - playsound(target.loc, 'sound/effects/snap.ogg', 50, 1) - icon_state = "mousetrap" - armed = 0 -/* - else if (ismouse(target)) - target.adjustBruteLoss(100) -*/ - -/obj/item/weapon/mousetrap/attack_self(mob/living/user as mob) - if(!armed) - icon_state = "mousetraparmed" - user << "\blue You arm the mousetrap." - else - icon_state = "mousetrap" - if(( (user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50))) - var/which_hand = "l_hand" - if(!user.hand) - which_hand = "r_hand" - src.triggered(user, which_hand) - user << "\red You accidentally trigger the mousetrap!" - for(var/mob/O in viewers(user, null)) - if(O == user) - continue - O.show_message("\red [user] accidentally sets off the mousetrap, breaking their fingers.", 1) - return - user << "\blue You disarm the mousetrap." - armed = !armed - playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) - -/obj/item/weapon/mousetrap/attack_hand(mob/living/user as mob) - if(armed) - if(( (user.getBrainLoss() >= 60 || CLUMSY in user.mutations)) && prob(50)) - var/which_hand = "l_hand" - if(!user.hand) - which_hand = "r_hand" - src.triggered(user, which_hand) - user << "\red You accidentally trigger the mousetrap!" - for(var/mob/O in viewers(user, null)) - if(O == user) - continue - O.show_message("\red [user] accidentally sets off the mousetrap, breaking their fingers.", 1) - return - ..() - -/obj/item/weapon/mousetrap/HasEntered(AM as mob|obj) - if(armed) - if(ishuman(AM)) - var/mob/living/carbon/H = AM - if(H.m_intent == "run") - src.triggered(H) - H << "\red You accidentally step on the mousetrap!" - for(var/mob/O in viewers(H, null)) - if(O == H) - continue - O.show_message("\red [H] accidentally steps on the mousetrap.", 1) - if(ismouse(AM)) - triggered(AM) - ..() - -/obj/item/weapon/mousetrap/hitby(A as mob|obj) - if(!armed) - return ..() - for(var/mob/O in viewers(src, null)) - O.show_message("\red The mousetrap is triggered by [A].", 1) - src.triggered(null) + return \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 179a1e7a9a7..e69028317c5 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -58,9 +58,6 @@ #define FILE_DIR "code/game/mecha/medical" #define FILE_DIR "code/game/mecha/working" #define FILE_DIR "code/game/objects" -#define FILE_DIR "code/game/objects/alien" -#define FILE_DIR "code/game/objects/closets" -#define FILE_DIR "code/game/objects/closets/secure" #define FILE_DIR "code/game/objects/devices" #define FILE_DIR "code/game/objects/devices/PDA" #define FILE_DIR "code/game/objects/effects" @@ -75,6 +72,9 @@ #define FILE_DIR "code/game/objects/stacks" #define FILE_DIR "code/game/objects/storage" #define FILE_DIR "code/game/objects/structures" +#define FILE_DIR "code/game/objects/structures/crates_lockers" +#define FILE_DIR "code/game/objects/structures/crates_lockers/closets" +#define FILE_DIR "code/game/objects/structures/crates_lockers/closets/secure" #define FILE_DIR "code/game/objects/tanks" #define FILE_DIR "code/game/turfs" #define FILE_DIR "code/game/vehicles" @@ -484,6 +484,7 @@ #include "code\game\machinery\teleporter.dm" #include "code\game\machinery\turrets.dm" #include "code\game\machinery\vending.dm" +#include "code\game\machinery\washing_machine.dm" #include "code\game\machinery\atmoalter\area_atmos_computer.dm" #include "code\game\machinery\atmoalter\canister.dm" #include "code\game\machinery\atmoalter\meter.dm" @@ -573,59 +574,13 @@ #include "code\game\objects\empulse.dm" #include "code\game\objects\explosion.dm" #include "code\game\objects\explosion_recursive.dm" -#include "code\game\objects\grille.dm" +#include "code\game\objects\facehugger.dm" #include "code\game\objects\items.dm" -#include "code\game\objects\kitchen.dm" -#include "code\game\objects\ladders.dm" -#include "code\game\objects\largecrate.dm" -#include "code\game\objects\mineral_doors.dm" -#include "code\game\objects\noticeboard.dm" #include "code\game\objects\object_procs.dm" -#include "code\game\objects\portals.dm" #include "code\game\objects\shooting_range.dm" -#include "code\game\objects\sign_decals.dm" -#include "code\game\objects\stool.dm" #include "code\game\objects\structures.dm" -#include "code\game\objects\tables_racks.dm" -#include "code\game\objects\tank.dm" #include "code\game\objects\toys.dm" -#include "code\game\objects\transfer_valve.dm" -#include "code\game\objects\uplinks.dm" -#include "code\game\objects\washing_machine.dm" -#include "code\game\objects\watercloset.dm" #include "code\game\objects\weapons.dm" -#include "code\game\objects\alien\acid.dm" -#include "code\game\objects\alien\defines.dm" -#include "code\game\objects\alien\egg.dm" -#include "code\game\objects\alien\facehugger.dm" -#include "code\game\objects\alien\nest.dm" -#include "code\game\objects\alien\resin.dm" -#include "code\game\objects\alien\weeds.dm" -#include "code\game\objects\closets\bombsuit.dm" -#include "code\game\objects\closets\emergency.dm" -#include "code\game\objects\closets\extinguisher.dm" -#include "code\game\objects\closets\fireaxe.dm" -#include "code\game\objects\closets\firecloset.dm" -#include "code\game\objects\closets\fitnesscloset.dm" -#include "code\game\objects\closets\gimmick.dm" -#include "code\game\objects\closets\gmcloset.dm" -#include "code\game\objects\closets\janitor.dm" -#include "code\game\objects\closets\kitchen.dm" -#include "code\game\objects\closets\l3closet.dm" -#include "code\game\objects\closets\malfunction.dm" -#include "code\game\objects\closets\nuclear.dm" -#include "code\game\objects\closets\syndicate.dm" -#include "code\game\objects\closets\thunderdome.dm" -#include "code\game\objects\closets\wardrobe.dm" -#include "code\game\objects\closets\secure\bar.dm" -#include "code\game\objects\closets\secure\cargo.dm" -#include "code\game\objects\closets\secure\engineering.dm" -#include "code\game\objects\closets\secure\hydroponics.dm" -#include "code\game\objects\closets\secure\medical.dm" -#include "code\game\objects\closets\secure\personal.dm" -#include "code\game\objects\closets\secure\scientist.dm" -#include "code\game\objects\closets\secure\secure_closets.dm" -#include "code\game\objects\closets\secure\security.dm" #include "code\game\objects\devices\aicard.dm" #include "code\game\objects\devices\chameleonproj.dm" #include "code\game\objects\devices\flash.dm" @@ -639,14 +594,20 @@ #include "code\game\objects\devices\shields.dm" #include "code\game\objects\devices\taperecorder.dm" #include "code\game\objects\devices\traitordevices.dm" +#include "code\game\objects\devices\transfer_valve.dm" +#include "code\game\objects\devices\uplinks.dm" #include "code\game\objects\devices\PDA\cart.dm" #include "code\game\objects\devices\PDA\chatroom.dm" #include "code\game\objects\devices\PDA\PDA.dm" #include "code\game\objects\devices\PDA\radio.dm" +#include "code\game\objects\effects\aliens.dm" #include "code\game\objects\effects\biomass.dm" #include "code\game\objects\effects\effect_system.dm" #include "code\game\objects\effects\gibs.dm" #include "code\game\objects\effects\glowshroom.dm" +#include "code\game\objects\effects\mines.dm" +#include "code\game\objects\effects\portals.dm" +#include "code\game\objects\effects\signs.dm" #include "code\game\objects\effects\decals\blood.dm" #include "code\game\objects\effects\decals\contraband.dm" #include "code\game\objects\effects\spawners\bombspawner.dm" @@ -680,6 +641,7 @@ #include "code\game\objects\items\weapons\manuals.dm" #include "code\game\objects\items\weapons\medical.dm" #include "code\game\objects\items\weapons\mop.dm" +#include "code\game\objects\items\weapons\mousetraps.dm" #include "code\game\objects\items\weapons\paint.dm" #include "code\game\objects\items\weapons\paiwire.dm" #include "code\game\objects\items\weapons\plant_bag.dm" @@ -703,6 +665,7 @@ #include "code\game\objects\items\weapons\implants\implantfreedom.dm" #include "code\game\objects\items\weapons\implants\implantnanoaug.dm" #include "code\game\objects\items\weapons\implants\implantpad.dm" +#include "code\game\objects\items\weapons\implants\implantuplink.dm" #include "code\game\objects\radio\beacon.dm" #include "code\game\objects\radio\electropack.dm" #include "code\game\objects\radio\encryptionkey.dm" @@ -729,20 +692,57 @@ #include "code\game\objects\storage\storage.dm" #include "code\game\objects\storage\toolbox.dm" #include "code\game\objects\storage\uplink_kits.dm" -#include "code\game\objects\structures\closets.dm" -#include "code\game\objects\structures\crates.dm" +#include "code\game\objects\structures\aliennests.dm" #include "code\game\objects\structures\displaycase.dm" #include "code\game\objects\structures\door_assembly.dm" #include "code\game\objects\structures\electricchair.dm" +#include "code\game\objects\structures\grille.dm" +#include "code\game\objects\structures\kitchen_spike.dm" +#include "code\game\objects\structures\ladders.dm" #include "code\game\objects\structures\lamarr_cage.dm" +#include "code\game\objects\structures\mineral_doors.dm" #include "code\game\objects\structures\mirror.dm" #include "code\game\objects\structures\mop_bucket.dm" #include "code\game\objects\structures\musician.dm" +#include "code\game\objects\structures\noticeboard.dm" +#include "code\game\objects\structures\stool_chair_bed.dm" +#include "code\game\objects\structures\tables_racks.dm" +#include "code\game\objects\structures\target_stake.dm" +#include "code\game\objects\structures\watercloset.dm" #include "code\game\objects\structures\windoor_assembly.dm" #include "code\game\objects\structures\window.dm" +#include "code\game\objects\structures\crates_lockers\closets.dm" +#include "code\game\objects\structures\crates_lockers\crates.dm" +#include "code\game\objects\structures\crates_lockers\largecrate.dm" +#include "code\game\objects\structures\crates_lockers\closets\bombsuit.dm" +#include "code\game\objects\structures\crates_lockers\closets\emergency.dm" +#include "code\game\objects\structures\crates_lockers\closets\extinguisher.dm" +#include "code\game\objects\structures\crates_lockers\closets\fireaxe.dm" +#include "code\game\objects\structures\crates_lockers\closets\firecloset.dm" +#include "code\game\objects\structures\crates_lockers\closets\fitnesscloset.dm" +#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" +#include "code\game\objects\structures\crates_lockers\closets\gmcloset.dm" +#include "code\game\objects\structures\crates_lockers\closets\janitor.dm" +#include "code\game\objects\structures\crates_lockers\closets\kitchen.dm" +#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" +#include "code\game\objects\structures\crates_lockers\closets\malfunction.dm" +#include "code\game\objects\structures\crates_lockers\closets\nuclear.dm" +#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" +#include "code\game\objects\structures\crates_lockers\closets\thunderdome.dm" +#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" #include "code\game\objects\tanks\emergency.dm" #include "code\game\objects\tanks\jetpack.dm" -#include "code\game\objects\tanks\oxygen.dm" +#include "code\game\objects\tanks\tank_types.dm" +#include "code\game\objects\tanks\tanks.dm" #include "code\game\turfs\turf.dm" #include "code\game\vehicles\vehicle.dm" #include "code\game\vehicles\airtight\airtight.dm"