Merge remote-tracking branch 'zomgponies/master'

This commit is contained in:
Regen
2014-02-07 23:01:24 +01:00
213 changed files with 24761 additions and 23044 deletions
+3 -2
View File
@@ -79,6 +79,7 @@
#include "code\controllers\_DynamicAreaLighting_TG.dm"
#include "code\controllers\configuration.dm"
#include "code\controllers\failsafe.dm"
#include "code\controllers\garbage.dm"
#include "code\controllers\lighting_controller.dm"
#include "code\controllers\master_controller.dm"
#include "code\controllers\shuttle_controller.dm"
@@ -579,7 +580,6 @@
#include "code\game\objects\items\weapons\power_cells.dm"
#include "code\game\objects\items\weapons\RCD.dm"
#include "code\game\objects\items\weapons\RCS.dm"
#include "code\game\objects\items\weapons\RPD.dm"
#include "code\game\objects\items\weapons\RSF.dm"
#include "code\game\objects\items\weapons\scrolls.dm"
#include "code\game\objects\items\weapons\shields.dm"
@@ -1102,7 +1102,6 @@
#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm"
#include "code\modules\mob\living\simple_animal\friendly\lizard.dm"
#include "code\modules\mob\living\simple_animal\friendly\mouse.dm"
#include "code\modules\mob\living\simple_animal\friendly\mushroom.dm"
#include "code\modules\mob\living\simple_animal\friendly\slime.dm"
#include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm"
#include "code\modules\mob\living\simple_animal\friendly\tomato.dm"
@@ -1117,6 +1116,7 @@
#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\mining_mobs.dm"
#include "code\modules\mob\living\simple_animal\hostile\mushroom.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"
@@ -1382,6 +1382,7 @@
#include "code\WorkInProgress\fireworks.dm"
#include "code\WorkInProgress\periodic_news.dm"
#include "code\WorkInProgress\Apples\artifacts.dm"
#include "code\WorkInProgress\Cael_Aislinn\sculpture.dm"
#include "code\WorkInProgress\Cael_Aislinn\Jungle\falsewall.dm"
#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle.dm"
#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_animals.dm"
@@ -154,4 +154,4 @@
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
del(src)
qdel(src)
@@ -90,6 +90,9 @@
if(welded)
return 0
// New GC does this sometimes
if(!loc) return
var/datum/gas_mixture/environment = loc.return_air()
var/environment_pressure = environment.return_pressure()
@@ -107,6 +107,8 @@
//broadcast_status()
if(!on)
return 0
// New GC does this sometimes
if(!loc) return
var/datum/gas_mixture/environment = loc.return_air()
+2 -2
View File
@@ -30,7 +30,7 @@ datum/pipe_network
//Notes: Assuming that members will add themselves to appropriate roster in network_expand()
if(!start_normal)
del(src)
qdel(src)
start_normal.network_expand(src, reference)
@@ -39,7 +39,7 @@ datum/pipe_network
if((normal_members.len>0)||(line_members.len>0))
pipe_networks += src
else
del(src)
qdel(src)
proc/merge(datum/pipe_network/giver)
if(giver==src) return 0
+1 -1
View File
@@ -94,7 +94,7 @@
var/have_node2 = node2?1:0
icon_state = "exposed[have_node1][have_node2]"
if(!node1&&!node2)
del(src)
qdel(src)
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/initialize()
for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions))
+5 -6
View File
@@ -164,7 +164,7 @@ obj/machinery/atmospherics/pipe
var/datum/effect/effect/system/harmless_smoke_spread/smoke = new
smoke.set_up(1,0, src.loc, 0)
smoke.start()
del(src)
qdel(src)
proc/normalize_dir()
if(dir==3)
@@ -202,7 +202,7 @@ obj/machinery/atmospherics/pipe
else
if(!node1&&!node2)
del(src) //TODO: silent deleting looks weird
qdel(src) //TODO: silent deleting looks weird
var/have_node1 = node1?1:0
var/have_node2 = node2?1:0
icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]"
@@ -540,7 +540,6 @@ obj/machinery/atmospherics/pipe
dir = SOUTH
initialize_directions = SOUTH
var/build_killswitch = 1
var/obj/machinery/atmospherics/node1
@@ -740,7 +739,7 @@ obj/machinery/atmospherics/pipe
icon_state = "manifold_[connected]_[unconnected]"
if(!connected)
del(src)
qdel(src)
return
@@ -998,7 +997,7 @@ obj/machinery/atmospherics/pipe
overlays += new/image(con,dir=8)
if(!node1 && !node2 && !node3 && !node4)
del(src)
qdel(src)
return
initialize()
@@ -1228,4 +1227,4 @@ obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/u
if (meter.target == src)
new /obj/item/pipe_meter(T)
del(meter)
del(src)
qdel(src)
+22 -23
View File
@@ -22,10 +22,8 @@
/mob/living/simple_animal/sculpture/proc/GrabMob(var/mob/living/target)
if(target && target != src && ishuman(target))
G = new /obj/item/weapon/grab(target)
G.assailant = src
G.layer = 20
G.affecting = target
G = new /obj/item/weapon/grab(src, target)
G.loc=src
target.grabbed_by += G
G.synch()
target.LAssailant = src
@@ -34,13 +32,12 @@
visible_message("\red [src] has grabbed [target]!")
target << "\red <b>You feel something suddenly grab you around the neck from behind!</b> Everything goes black..."
G.state = 3
G.killing = 1
G.state = GRAB_KILL
desc = "It's some kind of human sized, doll-like sculpture, with weird discolourations on some parts of it. It appears to be quite solid. [G ? "\red The sculpture is holding [G.affecting] in a vice-like grip." : ""]"
target.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been grabbed by SCP-173, and is being strangled!</font>")
log_admin("[target] ([target.ckey]) has been grabbed and is being strangled by SCP-173.")
message_admins("Alert: [target.real_name] has been grabbed and is being strangled by SCP-173. Set var/allow_escape = 1 to allow this player to escape temporarily, or var/hibernate = 1 to disable it entirely.")
message_admins("Alert: [target.real_name] has been grabbed and is being strangled by SCP-173.") //Set var/allow_escape = 1 to allow this player to escape temporarily, or var/hibernate = 1 to disable it entirely.
/mob/living/simple_animal/sculpture/proc/Escape()
var/list/turfs = new/list()
@@ -49,7 +46,7 @@
continue
else if(istype(thisturf, /turf/simulated/wall))
continue
else if(istype(thisturf, /turf/simulated/mineral))
else if(istype(thisturf, /turf/unsimulated/mineral))
continue
else if(istype(thisturf, /turf/simulated/shuttle/wall))
continue
@@ -73,12 +70,11 @@
desc = "It's some kind of human sized, doll-like sculpture, with weird discolourations on some parts of it. It appears to be quite solid."
//if we are sent into forced hibernation mode, allow our victim to escape
if(hibernate && G && G.killing == 1)
if(hibernate && G && G.state == GRAB_KILL)
if(G)
G.affecting << "\red You suddenly feel the grip around your neck being loosened!"
visible_message("\red [src] suddenly loosens it's grip!")
G.killing = 0
G.state = 1
visible_message("\red [src] suddenly loosens it's grip due to hibernate!")
G.state = GRAB_AGGRESSIVE
return
//
@@ -87,8 +83,7 @@
if(G)
G.affecting << "\red You suddenly feel the grip around your neck being loosened!"
visible_message("\red [src] suddenly loosens it's grip!")
G.killing = 0
G.state = 1
G.state = GRAB_AGGRESSIVE
if(!observed)
Escape()
observed = 1
@@ -97,6 +92,10 @@
if(istype(get_turf(src), /turf/space) || hibernate)
return
// Grabbing
if(G)
G.process()
for(var/mob/living/M in view(7, src))
if(M.stat || M == src)
continue
@@ -136,7 +135,7 @@
//see if we're able to do stuff
if(!observed || in_darkness)
if(G)
if(prob(random_escape_chance))
if(prob(1))
//chance to allow the stranglee to escape
allow_escape = 1
if(G.affecting.stat == 2)
@@ -212,7 +211,7 @@
continue
else if(istype(thisturf, /turf/simulated/wall))
continue
else if(istype(thisturf, /turf/simulated/mineral))
else if(istype(thisturf, /turf/unsimulated/mineral))
continue
else if(istype(thisturf, /turf/simulated/shuttle/wall))
continue
@@ -237,13 +236,13 @@
src.dir = get_dir(src, target_mob)
next_turf = get_step(src, get_dir(next_turf,target_turf))
num_turfs--
else if(G)
//we can't move while observed, so we can't effectively strangle any more
//our grip is still rock solid, but the victim has a chance to escape
G.affecting << "\red You suddenly feel the grip around your neck being loosened!"
visible_message("\red [src] suddenly loosens it's grip!")
G.state = 1
G.killing = 0
// else if(G)
// //we can't move while observed, so we can't effectively strangle any more //since victim is observer this means no strangling
// //our grip is still rock solid, but the victim has a chance to escape
// G.affecting << "\red You suddenly feel the grip around your neck being loosened!"
// visible_message("\red [src] suddenly loosens it's grip due to being observed!")
// G.state = GRAB_AGGRESSIVE
/mob/living/simple_animal/sculpture/attackby(var/obj/item/O as obj, var/mob/user as mob)
..()
+6 -4
View File
@@ -147,10 +147,12 @@ You've gained <b>[totalkarma]</b> total karma in your time here.<br>"}
<a href='?src=\ref[src];KarmaBuy=2'>Unlock Nanotrasen Representative -- 15KP</a><br>
<a href='?src=\ref[src];KarmaBuy=3'>Unlock Customs Officer -- 30KP</a><br>
<a href='?src=\ref[src];KarmaBuy=4'>Unlock BlueShield -- 30KP</a><br>
<a href='?src=\ref[src];KarmaBuy=5'>Unlock Kidan -- 30KP</a><br>
<a href='?src=\ref[src];KarmaBuy=6'>Unlock Grey -- 30KP</a><br>
<a href='?src=\ref[src];KarmaBuy=7'>Unlock Vox -- 45KP</a><br>
<a href='?src=\ref[src];KarmaBuy=8'>Unlock Slime People -- 45KP</a><br>
<br>
<a href='?src=\ref[src];KarmaBuy=5'>Unlock Machine People -- 15KP</a><br>
<a href='?src=\ref[src];KarmaBuy=6'>Unlock Kidan -- 30KP</a><br>
<a href='?src=\ref[src];KarmaBuy=7'>Unlock Grey -- 30KP</a><br>
<a href='?src=\ref[src];KarmaBuy=8'>Unlock Vox -- 45KP</a><br>
<a href='?src=\ref[src];KarmaBuy=9'>Unlock Slime People -- 45KP</a><br>
<B>PLEASE NOTE THAT PEOPLE WHO TRY TO GAME THE KARMA SYSTEM WILL END UP ON THE WALL OF SHAME. THIS INCLUDES BUT IS NOT LIMITED TO TRADES, OOC KARMA BEGGING, CODE EXPLOITS, ETC.</B>
"}
+3 -3
View File
@@ -39,8 +39,8 @@ var/global/list/facial_hair_styles_male_list = list()
var/global/list/facial_hair_styles_female_list = list()
var/global/list/skin_styles_female_list = list() //unused
//Underwear
var/global/list/underwear_m = list("White", "Grey", "Green", "Blue", "Black", "Mankini", "Love-Hearts", "Black2", "Grey2", "Stripey", "Kinky", "None") //Curse whoever made male/female underwear diffrent colours
var/global/list/underwear_f = list("Red", "White", "Yellow", "Blue", "Black", "Thong", "Babydoll", "Baby-Blue", "Green", "Pink", "Kinky", "None")
var/global/list/underwear_m = list("White", "Grey", "Green", "Blue", "Black", "Mankini", "None") //Curse whoever made male/female underwear diffrent colours
var/global/list/underwear_f = list("Red", "White", "Yellow", "Blue", "Black", "Thong", "None")
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt")
@@ -125,4 +125,4 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al
for(var/path in typesof(prototype))
if(path == prototype) continue
L += new path()
return L
return L
+37
View File
@@ -1572,3 +1572,40 @@ proc/check_target_facings(mob/living/initator, mob/living/target)
return 2
if(initator.dir + 2 == target.dir || initator.dir - 2 == target.dir || initator.dir + 6 == target.dir || initator.dir - 6 == target.dir) //Initating mob is looking at the target, while the target mob is looking in a direction perpendicular to the 1st
return 3
/proc/texttospeechstrip(var/t_in)
var/t_out = ""
for(var/i=1, i<=length(t_in), i++)
var/ascii_char = text2ascii(t_in,i)
switch(ascii_char)
// A .. Z
if(65 to 90) //Uppercase Letters
if(lentext(t_out) <= 150)
t_out += ascii2text(ascii_char)
// a .. z
if(97 to 122) //Lowercase Letters
if(lentext(t_out) <= 150)
t_out += ascii2text(ascii_char)
// 0 .. 9
if(48 to 57) //Numbers
if(lentext(t_out) <= 150)
t_out += ascii2text(ascii_char)
// ` , - . ! ? : '
if(39,44,45,46,33,63,58,96,60,62) //Common name punctuation
if(lentext(t_out) <= 150)
t_out += ascii2text(ascii_char)
//Space
if(32)
if(lentext(t_out) <= 150)
t_out += ascii2text(ascii_char)
return t_out
/var/lastspeak = ""
/mob/proc/texttospeech(var/text, var/speed, var/pitch, var/accent, var/voice, var/echo)
text = texttospeechstrip(text)
lastspeak = text
ext_python("voice.py", "\"[accent]\" \"[voice]\" \"[pitch]\" \"[echo]\" \"[speed]\" \"[text]\" \"[src.ckey]\"")
+19 -8
View File
@@ -197,14 +197,15 @@ datum/hud/New(mob/owner)
vampire_hud()
//Triggered when F12 is pressed (Unless someone changed something in the DMF)
/mob/verb/button_pressed_F12()
/mob/verb/button_pressed_F12(var/full = 0 as null)
set name = "F12"
set hidden = 1
if(hud_used)
if(ishuman(src))
if(!src.client) return
if(!client) return
if(client.view != world.view)
return
if(hud_used.hud_shown)
hud_used.hud_shown = 0
if(src.hud_used.adding)
@@ -218,10 +219,15 @@ datum/hud/New(mob/owner)
//Due to some poor coding some things need special treatment:
//These ones are a part of 'adding', 'other' or 'hotkeybuttons' but we want them to stay
src.client.screen += src.hud_used.l_hand_hud_object //we want the hands to be visible
src.client.screen += src.hud_used.r_hand_hud_object //we want the hands to be visible
src.client.screen += src.hud_used.action_intent //we want the intent swticher visible
src.hud_used.action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is.
if(!full)
src.client.screen += src.hud_used.l_hand_hud_object //we want the hands to be visible
src.client.screen += src.hud_used.r_hand_hud_object //we want the hands to be visible
src.client.screen += src.hud_used.action_intent //we want the intent swticher visible
src.hud_used.action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is.
else
src.client.screen -= src.healths
src.client.screen -= src.internals
src.client.screen -= src.gun_setting_icon
//These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone.
src.client.screen -= src.zone_sel //zone_sel is a mob variable for some reason.
@@ -234,7 +240,12 @@ datum/hud/New(mob/owner)
src.client.screen += src.hud_used.other
if(src.hud_used.hotkeybuttons && !src.hud_used.hotkey_ui_hidden)
src.client.screen += src.hud_used.hotkeybuttons
if(src.healths)
src.client.screen |= src.healths
if(src.internals)
src.client.screen |= src.internals
if(src.gun_setting_icon)
src.client.screen |= src.gun_setting_icon
src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position
src.client.screen += src.zone_sel //This one is a special snowflake
+2 -14
View File
@@ -23,9 +23,6 @@
var/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour
var/allow_vote_restart = 0 // allow votes to restart
var/allow_vote_mode = 0 // allow votes to change mode
var/allow_admin_jump = 1 // allows admin jumping
var/allow_admin_spawning = 1 // allows admin item spawning
var/allow_admin_rev = 1 // allows admin revives
var/vote_delay = 6000 // minimum time between voting sessions (deciseconds, 10 minute default)
var/vote_period = 600 // length of voting period (deciseconds, default 1 minute)
var/vote_autotransfer_initial = 72000 // Length of time before the first autotransfer vote is called
@@ -258,16 +255,7 @@
if ("allow_vote_mode")
config.allow_vote_mode = 1
if ("allow_admin_jump")
config.allow_admin_jump = 1
if("allow_admin_rev")
config.allow_admin_rev = 1
if ("allow_admin_spawning")
config.allow_admin_spawning = 1
if ("no_dead_vote")
if("no_dead_vote")
config.vote_no_dead = 1
if ("default_no_vote")
@@ -455,7 +443,7 @@
if(world.system_type == UNIX)
config.python_path = "/usr/bin/env python2"
else //probably windows, if not this should work anyway
config.python_path = "python"
config.python_path = "pythonw"
if("assistant_limit")
config.assistantlimit = 1
+79
View File
@@ -0,0 +1,79 @@
#define GC_COLLECTIONS_PER_TICK 100
var/global/datum/controller/garbage_collector/garbage
var/global/list/uncollectable_vars=list(
"alpha",
"bestF",
"bounds",
"bound_height",
"bound_width",
"ckey",
"color",
"contents",
"gender",
"key",
//"loc",
"locs",
"luminosity",
"parent",
"parent_type",
"step_size",
"glide_size",
"step_x",
"step_y",
"step_z",
"tag",
"type",
"vars",
"verbs",
"x",
"y",
"z",
)
/datum/controller/garbage_collector
var/list/queue=list()
var/waiting=0
var/turf/trashbin=null
New()
trashbin=locate(0,0,CENTCOMM_Z)
proc/AddTrash(var/atom/movable/A)
if(!A)
return
A.loc=trashbin
queue.Add(A)
waiting++
proc/Pop()
var/atom/movable/A = queue[1]
if(!A) return
if(!istype(A,/atom/movable))
testing("GC given a [A.type].")
del(A)
return
for(var/vname in A.vars)
if(vname in uncollectable_vars)
continue
//testing("Unsetting [vname] in [A.type]!")
A.vars[vname]=null
A.loc=null
queue.Remove(A)
proc/process()
for(var/i=0;i<min(waiting,GC_COLLECTIONS_PER_TICK);i++)
if(waiting)
Pop()
waiting--
/**
* NEVER USE THIS FOR ANYTHING OTHER THAN /atom/movable
* OTHER TYPES CANNOT BE QDEL'D BECAUSE THEIR LOC IS LOCKED OR THEY DON'T HAVE ONE.
*/
/proc/qdel(var/atom/movable/A)
if(!A) return
if(!istype(A))
warning("qdel passed a [A.type]. qdel() can only handle /atom/movable types.")
del(A)
return
garbage.AddTrash(A)
+13 -3
View File
@@ -27,6 +27,7 @@ datum/controller/game_controller
var/nano_cost = 0
var/events_cost = 0
var/ticker_cost = 0
var/gc_cost = 0
var/total_cost = 0
var/last_thing_processed
@@ -64,6 +65,9 @@ datum/controller/game_controller/proc/setup()
if(!ticker)
ticker = new /datum/controller/gameticker()
if(!garbage)
garbage = new /datum/controller/garbage_collector()
setup_objects()
setupgenetics()
setupfactions()
@@ -216,8 +220,14 @@ datum/controller/game_controller/proc/process()
ticker.process()
ticker_cost = (world.timeofday - timer) / 10
// GC
timer = world.timeofday
last_thing_processed = garbage.type
garbage.process()
gc_cost = (world.timeofday - timer) / 10
//TIMING
total_cost = air_cost + sun_cost + mobs_cost + diseases_cost + machines_cost + objects_cost + networks_cost + powernets_cost + nano_cost + events_cost + ticker_cost
total_cost = air_cost + sun_cost + mobs_cost + diseases_cost + machines_cost + objects_cost + networks_cost + powernets_cost + nano_cost + events_cost + ticker_cost + gc_cost
var/end_time = world.timeofday
if(end_time < start_time)
@@ -252,7 +262,7 @@ datum/controller/game_controller/proc/process_machines()
var/i = 1
while(i<=machines.len)
var/obj/machinery/Machine = machines[i]
if(Machine)
if(Machine && Machine.loc)
last_thing_processed = Machine.type
if(Machine.process() != PROCESS_KILL)
if(Machine)
@@ -266,7 +276,7 @@ datum/controller/game_controller/proc/process_objects()
var/i = 1
while(i<=processing_objects.len)
var/obj/Object = processing_objects[i]
if(Object)
if(Object && Object.loc)
last_thing_processed = Object.type
Object.process()
i++
+3
View File
@@ -1,3 +1,6 @@
/hook/startup/proc/createDatacore()
data_core = new /obj/effect/datacore()
return 1
/obj/effect/datacore/proc/manifest(var/nosleep = 0)
spawn()
+39 -6
View File
@@ -275,6 +275,7 @@ client
if(isobj(D))
body += "<option value='?_src_=vars;delall=\ref[D]'>Delete all of type</option>"
if(isobj(D) || ismob(D) || isturf(D))
body += "<option value='?_src_=vars;addreagent=\ref[D]'>Add reagent</option>"
body += "<option value='?_src_=vars;explode=\ref[D]'>Trigger explosion</option>"
body += "<option value='?_src_=vars;emp=\ref[D]'>Trigger EM pulse</option>"
@@ -612,6 +613,36 @@ client
log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
else if(href_list["addreagent"]) /* Made on /TG/, credit to them. */
if(!check_rights(0)) return
var/atom/A = locate(href_list["addreagent"])
if(!A.reagents)
var/amount = input(usr, "Specify the reagent size of [A]", "Set Reagent Size", 50) as num
if(amount)
A.create_reagents(amount)
if(A.reagents)
var/list/reagent_options = list()
for(var/r_id in chemical_reagents_list)
var/datum/reagent/R = chemical_reagents_list[r_id]
reagent_options[R.name] = r_id
if(reagent_options.len)
reagent_options = sortAssoc(reagent_options)
reagent_options.Insert(1, "CANCEL")
var/chosen = input(usr, "Choose a reagent to add.", "Choose a reagent.") in reagent_options
var/chosen_id = reagent_options[chosen]
if(chosen_id)
var/amount = input(usr, "Choose the amount to add.", "Choose the amount.", A.reagents.maximum_volume) as num
if(amount)
A.reagents.add_reagent(chosen_id, amount)
log_admin("[key_name(usr)] has added [amount] units of [chosen] to \the [A]")
message_admins("\blue [key_name(usr)] has added [amount] units of [chosen] to \the [A]")
else if(href_list["explode"])
if(!check_rights(R_DEBUG|R_FUN)) return
@@ -813,13 +844,14 @@ client
else if(href_list["addverb"])
if(!check_rights(R_DEBUG)) return
var/mob/living/H = locate(href_list["addverb"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living"
return
var/list/possibleverbs = list()
possibleverbs += "Cancel" // One for the top...
possibleverbs += typesof(/mob/proc,/mob/verb,/mob/living/proc,/mob/living/verb)
switch(H.type)
if(/mob/living/carbon/human)
@@ -829,16 +861,17 @@ client
if(/mob/living/silicon/ai)
possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/ai/proc,/mob/living/silicon/ai/verb)
possibleverbs -= H.verbs
possibleverbs += "Cancel" // ...And one for the bottom
var/verb = input("Select a verb!", "Verbs",null) as anything in possibleverbs
if(!H)
usr << "Mob doesn't exist anymore"
return
if(!verb)
if(!verb || verb == "Cancel")
return
else
H.verbs += verb
else if(href_list["remverb"])
if(!check_rights(R_DEBUG)) return
@@ -856,7 +889,7 @@ client
else
H.verbs -= verb
else if(href_list["regenerateicons"])
if(!check_rights(0)) return
+5
View File
@@ -16,6 +16,11 @@
/datum/disease/appendicitis/stage_act()
..()
if(istype(affected_mob,/mob/living/carbon/human))
var/mob/living/carbon/human/H = affected_mob
if(H.species.name == "Diona" || H.species.name == "Machine" || H.species.name == "Vox") src.cure()
if(stage == 1)
if(affected_mob.op_stage.appendix == 2.0)
// appendix is removed, can't get infected again
+1
View File
@@ -6,6 +6,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
/obj/effect/proc_holder/spell
name = "Spell"
desc = "A wizard spell"
panel = "Spells"//What panel the proc holder needs to go on.
density = 0
opacity = 0
+5 -4
View File
@@ -45,12 +45,13 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/food
name = "Food crate"
contains = list(/obj/item/weapon/reagent_containers/food/drinks/flour,
contains = list(/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/drinks/milk,
/obj/item/weapon/reagent_containers/food/drinks/milk,
/obj/item/weapon/storage/fancy/egg_box,
/obj/item/weapon/reagent_containers/food/condiment/enzyme,
/obj/item/weapon/reagent_containers/food/snacks/grown/banana,
/obj/item/weapon/reagent_containers/food/snacks/grown/banana,
/obj/item/weapon/reagent_containers/food/snacks/grown/banana)
cost = 10
@@ -1064,4 +1065,4 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
cost = 15
containertype = /obj/structure/closet/crate
containername = "mafia supply crate"
group = "Operations"
group = "Operations"
+22 -7
View File
@@ -526,11 +526,18 @@ proc/process_ghost_teleport_locs()
icon_state = "yellow"
requires_power = 0
/area/ninja_outpost
name = "\improper SpiderClan Outpost"
/area/ninja
name = "\improper Ninja Area Parent"
icon_state = "ninjabase"
requires_power = 0
/area/ninja/outpost
name = "\improper SpiderClan Outpost"
/area/ninja/holding
name = "\improper SpiderClan Holding Facility"
/area/vox_station/transit
name = "\improper hyperspace"
icon_state = "shuttle"
@@ -881,6 +888,14 @@ proc/process_ghost_teleport_locs()
name = "\improper Messaging Server Room"
icon_state = "server"
/area/ntrep
name = "\improper NanoTrasen Rep Office"
icon_state = "bluenew"
/area/blueshield
name = "\improper Blueshield's Office"
icon_state = "blueold"
//Crew
/area/crew_quarters
@@ -1138,7 +1153,7 @@ proc/process_ghost_teleport_locs()
/area/toxins/telesci
name = "\improper Telescience Lab"
icon_state = "toxmisc"
icon_state = "telesci"
//MedBay
@@ -1630,9 +1645,11 @@ proc/process_ghost_teleport_locs()
//GAYBAR
/area/secret/gaybar
name = "\improper Secret Space Bar"
name = "\improper Dance Bar"
requires_power = 0
icon_state = "pink"
icon_state = "dancebar"
//AI
@@ -1700,8 +1717,6 @@ proc/process_ghost_teleport_locs()
//Misc
/area/wreck/ai
name = "\improper AI Chamber"
icon_state = "ai"
+1 -1
View File
@@ -332,7 +332,7 @@
L.lastarea = newarea
// Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch
if(!(L && L.client && (L.client.prefs.toggles & SOUND_AMBIENCE))) return
if(!(L && L.client && (L.client.prefs.sound & SOUND_AMBIENCE))) return
if(!L.client.ambience_playing)
L.client.ambience_playing = 1
+3
View File
@@ -42,6 +42,9 @@
M.take_organ_damage(20)
/atom/proc/CheckParts()
return
/atom/proc/assume_air(datum/gas_mixture/giver)
del(giver)
return null
+8 -1
View File
@@ -183,4 +183,11 @@
/atom/movable/overlay/attack_hand(a, b, c)
if (src.master)
return src.master.attack_hand(a, b, c)
return
return
/////////////////////////////
// SINGULOTH PULL REFACTOR
/////////////////////////////
/atom/movable/proc/canSingulothPull(var/obj/machinery/singularity/singulo)
return 1
+1 -1
View File
@@ -32,7 +32,7 @@
#define DNA_UI_HAIR_STYLE 13
#define DNA_UI_LENGTH 13 // Update this when you add something, or you WILL break shit.
#define DNA_SE_LENGTH 50 // Was STRUCDNASIZE, size 27. 15 new blocks added = 42, plus room to grow.
#define DNA_SE_LENGTH 55 // Was STRUCDNASIZE, size 27. 15 new blocks added = 42, plus room to grow.
// Defines which values mean "on" or "off".
// This is to make some of the more OP superpowers a larger PITA to activate,
+5 -5
View File
@@ -253,7 +253,7 @@
ex_act(severity)
//Foreach goto(35)
//SN src = null
del(src)
qdel(src)
return
if(2.0)
if (prob(50))
@@ -262,7 +262,7 @@
ex_act(severity)
//Foreach goto(108)
//SN src = null
del(src)
qdel(src)
return
if(3.0)
if (prob(25))
@@ -271,7 +271,7 @@
ex_act(severity)
//Foreach goto(181)
//SN src = null
del(src)
qdel(src)
return
else
return
@@ -353,12 +353,12 @@
switch(severity)
if(1.0)
//SN src = null
del(src)
qdel(src)
return
if(2.0)
if (prob(50))
//SN src = null
del(src)
qdel(src)
return
else
return
+3 -7
View File
@@ -104,14 +104,10 @@
var/list/deactivation_messages=list()
/datum/dna/gene/basic/can_activate(var/mob/M,var/flags)
if(mutation==0)
return 0
// Probability check
if(flags & MUTCHK_FORCED || probinj(activation_prob,(flags&MUTCHK_FORCED)))
if(flags & MUTCHK_FORCED)
return 1
return 0
// Probability check
return probinj(activation_prob,(flags&MUTCHK_FORCED))
/datum/dna/gene/basic/activate(var/mob/M)
M.mutations.Add(mutation)
+84 -3
View File
@@ -9,7 +9,7 @@
// WAS: /datum/bioEffect/mute
/datum/dna/gene/disability/mute
name = "Mute"
desc = "Completley shuts down the speech center of the subject's brain."
desc = "Completely shuts down the speech center of the subject's brain."
activation_message = "You feel unable to express yourself at all."
deactivation_message = "You feel able to speak freely again."
@@ -84,7 +84,7 @@
/datum/dna/gene/disability/speech
can_activate(var/mob/M, var/flags)
// Can only activate one of these at a time.
if(is_type_in_list(/datum/dna/gene/disability/speech,M.mutations))
if(is_type_in_list(/datum/dna/gene/disability/speech,M.active_genes))
return 0
return ..(M,flags)
@@ -278,4 +278,85 @@
C << "\red [src.personalized_stink]"
else
C << "\red [stinkString()]"
*/
*/
////////////////////////////////////////////////////////////////////////
// WAS: /datum/bioEffect/immolate
/datum/dna/gene/basic/grant_spell/immolate
name = "Incendiary Mitochondria"
desc = "The subject becomes able to convert excess cellular energy into thermal energy."
activation_messages = list("You suddenly feel rather hot.")
deactivation_messages = list("You no longer feel uncomfortably hot.")
spelltype=/obj/effect/proc_holder/spell/targeted/immolate
New()
..()
block = IMMOLATEBLOCK
/obj/effect/proc_holder/spell/targeted/immolate
name = "Incendiary Mitochondria"
desc = "The subject becomes able to convert excess cellular energy into thermal energy."
panel = "Mutant Powers"
charge_type = "recharge"
charge_max = 600
clothes_req = 0
stat_allowed = 0
invocation_type = "none"
range = -1
selection_type = "range"
/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets)
if (istype(usr,/mob/living/))
var/mob/living/L = usr
L.adjust_fire_stacks(0.5) // Same as walking into fire. Was 100 (goon fire)
L.visible_message("\red <b>[L.name]</b> suddenly bursts into flames!")
//playsound(L.loc, 'mag_fireballlaunch.ogg', 50, 0)
return
////////////////////////////////////////////////////////////////////////
// WAS: /datum/bioEffect/melt
/datum/dna/gene/basic/grant_verb/melt
name = "Self Biomass Manipulation"
desc = "The subject becomes able to transform the matter of their cells into a liquid state."
activation_messages = list("You feel strange and jiggly.")
deactivation_messages = list("You feel more solid.")
verbtype=/proc/bioproc_melt
New()
..()
block = MELTBLOCK
/proc/bioproc_melt()
set name = "Dissolve"
set desc = "Transform yourself into a liquified state."
set category = "Mutant Abilities"
if (istype(usr,/mob/living/carbon/human/))
var/mob/living/carbon/human/H = usr
H.visible_message("\red <b>[H.name]'s flesh melts right off! Holy shit!</b>")
//if (H.gender == "female")
// playsound(H.loc, 'female_fallscream.ogg', 50, 0)
//else
// playsound(H.loc, 'male_fallscream.ogg', 50, 0)
//playsound(H.loc, 'bubbles.ogg', 50, 0)
//playsound(H.loc, 'loudcrunch2.ogg', 50, 0)
var/mob/living/carbon/human/skellington/nH = new /mob/living/carbon/human/skellington(H.loc)
nH.real_name = H.real_name
nH.name = "[H.name]'s skeleton"
//H.decomp_stage = 4
nH.brain_op_stage = 4
H.gib(1)
else
usr.visible_message("\red <b>[usr.name] melts into a pile of bloody viscera!</b>")
usr.gib(1)
return
+410 -7
View File
@@ -30,10 +30,15 @@
/datum/dna/gene/basic/stealth
can_activate(var/mob/M, var/flags)
// Can only activate one of these at a time.
if(is_type_in_list(/datum/dna/gene/basic/stealth,M.mutations))
if(is_type_in_list(/datum/dna/gene/basic/stealth,M.active_genes))
testing("Cannot activate [type]: /datum/dna/gene/basic/stealth in M.active_genes.")
return 0
return ..(M,flags)
deactivate(var/mob/M)
..(M)
M.alpha=255
// WAS: /datum/bioEffect/darkcloak
/datum/dna/gene/basic/stealth/darkcloak
name = "Cloak of Darkness"
@@ -49,9 +54,9 @@
if(!istype(T))
return
if(T.lighting_lumcount <= 2)
M.alpha = round((255 * 0.15))
M.alpha = 0
else
M.alpha = round((255 * 0.80))
M.alpha = round(255 * 0.80)
//WAS: /datum/bioEffect/chameleon
/datum/dna/gene/basic/stealth/chameleon
@@ -64,8 +69,406 @@
block=CHAMELEONBLOCK
OnMobLife(var/mob/M)
if((world.timeofday - M.last_move_intent) >= 30 && !M.stat && M.canmove && !M.restrained())
M.alpha = round((255 * 0.15))
if((world.time - M.last_movement) >= 30 && !M.stat && M.canmove && !M.restrained())
M.alpha = round(255 * 0.10)
else
M.alpha = round((255 * 0.80))
return
M.alpha = round(255 * 0.80)
/////////////////////////////////////////////////////////////////////////////////////////
/datum/dna/gene/basic/grant_spell
var/obj/effect/proc_holder/spell/spelltype
activate(var/mob/M, var/connected, var/flags)
..()
M.spell_list += new spelltype(M)
return 1
deactivate(var/mob/M, var/connected, var/flags)
..()
for(var/obj/effect/proc_holder/spell/S in M.spell_list)
if(istype(S,spelltype))
M.spell_list.Remove(S)
return 1
/datum/dna/gene/basic/grant_verb
var/verbtype
activate(var/mob/M, var/connected, var/flags)
..()
M.verbs += verbtype
return 1
deactivate(var/mob/M, var/connected, var/flags)
..()
M.verbs -= verbtype
// WAS: /datum/bioEffect/cryokinesis
/datum/dna/gene/basic/grant_spell/cryo
name = "Cryokinesis"
desc = "Allows the subject to lower the body temperature of others."
activation_messages = list("You notice a strange cold tingle in your fingertips.")
deactivation_messages = list("Your fingers feel warmer.")
spelltype = /obj/effect/proc_holder/spell/targeted/cryokinesis
New()
..()
block = CRYOBLOCK
/obj/effect/proc_holder/spell/targeted/cryokinesis
name = "Cryokinesis"
desc = "Drops the bodytemperature of another person."
panel = "Mutant Powers"
charge_type = "recharge"
charge_max = 600
clothes_req = 0
stat_allowed = 0
invocation_type = "none"
range = 7
selection_type = "range"
var/list/compatible_mobs = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
/obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets)
if(!targets.len)
usr << "<span class='notice'>No target found in range.</span>"
return
var/mob/living/carbon/C = targets[1]
if(!iscarbon(C))
usr << "\red This will only work on normal organic beings."
return
C.bodytemperature = -1500
C.ExtinguishMob()
C.visible_message("\red A cloud of fine ice crystals engulfs [C]!")
//playsound(usr.loc, 'bamf.ogg', 50, 0)
new/obj/effects/self_deleting(C.loc, icon('icons/effects/genetics.dmi', "cryokinesis"))
return
/obj/effects/self_deleting
density = 0
opacity = 0
anchored = 1
icon = null
desc = ""
//layer = 15
New(var/atom/location, var/icon/I, var/duration = 20, var/oname = "something")
src.name = oname
loc=location
src.icon = I
spawn(duration)
qdel(src)
///////////////////////////////////////////////////////////////////////////////////////////
// WAS: /datum/bioEffect/mattereater
/datum/dna/gene/basic/grant_spell/mattereater
name = "Matter Eater"
desc = "Allows the subject to eat just about anything without harm."
activation_messages = list("You feel hungry.")
deactivation_messages = list("You don't feel quite so hungry anymore.")
spelltype=/obj/effect/proc_holder/spell/targeted/eat
New()
..()
block = EATBLOCK
/obj/effect/proc_holder/spell/targeted/eat
name = "Eat"
desc = "Eat just about anything!"
panel = "Mutant Powers"
charge_type = "recharge"
charge_max = 300
clothes_req = 0
stat_allowed = 0
invocation_type = "none"
range = 1
selection_type = "range"
/obj/effect/proc_holder/spell/targeted/eat/choose_targets(mob/user = usr)
var/list/targets = list()
var/list/possible_targets = list()
for(var/obj/item/O in view_or_range(range, user, selection_type))
possible_targets += O
targets += input("Choose the target for the spell.", "Targeting") as mob in possible_targets
if(!targets.len) //doesn't waste the spell
revert_cast(user)
return
perform(targets)
/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets)
if(!targets.len)
usr << "<span class='notice'>No target found in range.</span>"
return
var/obj/item/the_item = targets[1]
usr.visible_message("\red [usr] eats [the_item].")
playsound(usr.loc, 'sound/items/eatfood.ogg', 50, 0)
del(the_item)
if(ishuman(usr))
var/mob/living/carbon/human/H=usr
for(var/name in H.organs_by_name)
var/datum/organ/external/affecting = null
if(!H.organs[name])
continue
affecting = H.organs[name]
if(!istype(affecting, /datum/organ/external))
continue
affecting.heal_damage(4, 0)
usr:UpdateDamageIcon()
usr:updatehealth()
return
////////////////////////////////////////////////////////////////////////
//WAS: /datum/bioEffect/jumpy
/datum/dna/gene/basic/grant_spell/jumpy
name = "Jumpy"
desc = "Allows the subject to leap great distances."
//cooldown = 30
activation_messages = list("Your leg muscles feel taut and strong.")
deactivation_messages = list("Your leg muscles shrink back to normal.")
spelltype =/obj/effect/proc_holder/spell/targeted/leap
New()
..()
block = JUMPBLOCK
/obj/effect/proc_holder/spell/targeted/leap
name = "Jump"
desc = "Leap great distances!"
panel = "Mutant Powers"
range = -1
include_user = 1
charge_type = "recharge"
charge_max = 30
clothes_req = 0
stat_allowed = 0
invocation_type = "none"
/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets)
if (istype(usr.loc,/mob/))
usr << "\red You can't jump right now!"
return
if (istype(usr.loc,/turf/))
usr.visible_message("\red <b>[usr.name]</b> takes a huge leap!")
playsound(usr.loc, 'sound/weapons/thudswoosh.ogg', 50, 1)
var/prevLayer = usr.layer
usr.layer = 15
for(var/i=0, i<10, i++)
step(usr, usr.dir)
if(i < 5) usr.pixel_y += 8
else usr.pixel_y -= 8
sleep(1)
if (M_FAT in usr.mutations && prob(66))
usr.visible_message("\red <b>[usr.name]</b> crashes due to their heavy weight!")
//playsound(usr.loc, 'zhit.wav', 50, 1)
usr.weakened += 10
usr.stunned += 5
usr.layer = prevLayer
if (istype(usr.loc,/obj/))
var/obj/container = usr.loc
usr << "\red You leap and slam your head against the inside of [container]! Ouch!"
usr.paralysis += 3
usr.weakened += 5
container.visible_message("\red <b>[usr.loc]</b> emits a loud thump and rattles a bit.")
playsound(usr.loc, 'sound/effects/bang.ogg', 50, 1)
var/wiggle = 6
while(wiggle > 0)
wiggle--
container.pixel_x = rand(-3,3)
container.pixel_y = rand(-3,3)
sleep(1)
container.pixel_x = 0
container.pixel_y = 0
return
////////////////////////////////////////////////////////////////////////
// WAS: /datum/bioEffect/polymorphism
/datum/dna/gene/basic/grant_spell/polymorph
name = "Polymorphism"
desc = "Enables the subject to reconfigure their appearance to mimic that of others."
spelltype =/obj/effect/proc_holder/spell/targeted/polymorph
//cooldown = 1800
activation_messages = list("You don't feel entirely like yourself somehow.")
deactivation_messages = list("You feel secure in your identity.")
New()
..()
block = POLYMORPHBLOCK
/obj/effect/proc_holder/spell/targeted/polymorph
name = "Polymorph"
desc = "Mimic the appearance of others!"
panel = "Mutant Powers"
charge_max = 1800
clothes_req = 0
stat_allowed = 0
invocation_type = "none"
range = 1
selection_type = "range"
/obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets)
var/mob/living/M=targets[1]
if(!ishuman(M))
usr << "\red You can only change your appearance to that of another human."
return
if(!ishuman(usr)) return
//playsound(usr.loc, 'blobattack.ogg', 50, 1)
usr.visible_message("\red [usr]'s body shifts and contorts.")
spawn(10)
if(M && usr)
//playsound(usr.loc, 'gib.ogg', 50, 1)
usr.UpdateAppearance(M.dna.UI)
usr:real_name = M:real_name
usr:name = M:name
////////////////////////////////////////////////////////////////////////
// WAS: /datum/bioEffect/empath
/datum/dna/gene/basic/grant_verb/empath
name = "Empathic Thought"
desc = "The subject becomes able to read the minds of others for certain information."
verbtype = /proc/bioproc_empath
activation_messages = list("You suddenly notice more about others than you did before.")
deactivation_messages = list("You no longer feel able to sense intentions.")
New()
..()
block = EMPATHBLOCK
/proc/bioproc_empath(var/mob/living/carbon/M in range(7,usr))
set name = "Read Mind"
set desc = "Read the minds of others for information."
set category = "Mutant Abilities"
if(!iscarbon(M))
usr << "\red You may only use this on other organic beings."
return
if(usr.stat)
return
if (M_PSY_RESIST in M.mutations)
usr << "\red You can't see into [M.name]'s mind at all!"
return
if (M.stat == 2)
usr << "\red [M.name] is dead and cannot have their mind read."
return
if (M.health < 0)
usr << "\red [M.name] is dying, and their thoughts are too scrambled to read."
return
usr << "\blue Mind Reading of [M.name]:</b>"
var/pain_condition = M.health
// lower health means more pain
var/list/randomthoughts = list("what to have for lunch","the future","the past","money",
"their hair","what to do next","their job","space","amusing things","sad things",
"annoying things","happy things","something incoherent","something they did wrong")
var/thoughts = "thinking about [pick(randomthoughts)]"
if (M.fire_stacks)
pain_condition -= 50
thoughts = "preoccupied with the fire"
if (M.radiation)
pain_condition -= 25
switch(pain_condition)
if (81 to INFINITY)
usr << "\blue <b>Condition</b>: [M.name] feels good."
if (61 to 80)
usr << "\blue <b>Condition</b>: [M.name] is suffering mild pain."
if (41 to 60)
usr << "\blue <b>Condition</b>: [M.name] is suffering significant pain."
if (21 to 40)
usr << "\blue <b>Condition</b>: [M.name] is suffering severe pain."
else
usr << "\blue <b>Condition</b>: [M.name] is suffering excruciating pain."
thoughts = "haunted by their own mortality"
switch(M.a_intent)
if ("help")
usr << "\blue <b>Mood</b>: You sense benevolent thoughts from [M.name]."
if ("disarm")
usr << "\blue <b>Mood</b>: You sense cautious thoughts from [M.name]."
if ("grab")
usr << "\blue <b>Mood</b>: You sense hostile thoughts from [M.name]."
if ("harm")
usr << "\blue <b>Mood</b>: You sense cruel thoughts from [M.name]."
for(var/mob/living/L in view(7,M))
if (L == M)
continue
thoughts = "thinking about punching [L.name]"
break
else
usr << "\blue <b>Mood</b>: You sense strange thoughts from [M.name]."
if (istype(M,/mob/living/carbon/human))
var/numbers[0]
var/mob/living/carbon/human/H = M
if(H.mind && H.mind.initial_account)
numbers += H.mind.initial_account.account_number
numbers += H.mind.initial_account.remote_access_pin
if(numbers.len>0)
usr << "\blue <b>Numbers</b>: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name]."
usr << "\blue <b>Thoughts</b>: [M.name] is currently [thoughts]."
if (/datum/dna/gene/basic/grant_verb/empath in M.active_genes)
M << "\red You sense [usr.name] reading your mind."
else if (prob(5) || M.mind.assigned_role=="Chaplain")
M << "\red You sense someone intruding upon your thoughts..."
return
////////////////////////////////////////////////////////////////////////
// WAS: /datum/bioEffect/superfart
/datum/dna/gene/basic/superfart
name = "High-Pressure Intestines"
desc = "Vastly increases the gas capacity of the subject's digestive tract."
activation_messages = list("You feel bloated and gassy.")
deactivation_messages = list("You no longer feel gassy. What a relief!")
mutation = M_SUPER_FART
New()
..()
block = SUPERFARTBLOCK
+4
View File
@@ -71,6 +71,8 @@
block=COLDBLOCK
can_activate(var/mob/M,var/flags)
if(flags & MUTCHK_FORCED)
return !(/datum/dna/gene/basic/cold_resist in M.active_genes)
// Probability check
var/_prob = 15
if(M_RESIST_COLD in M.mutations)
@@ -90,6 +92,8 @@
block=FIREBLOCK
can_activate(var/mob/M,var/flags)
if(flags & MUTCHK_FORCED)
return !(/datum/dna/gene/basic/heat_resist in M.active_genes)
// Probability check
var/_prob=30
if(M_RESIST_HEAT in M.mutations)
+54 -6
View File
@@ -40,6 +40,7 @@
attacktext = "hits"
attack_sound = 'sound/weapons/genhit1.ogg'
var/obj/effect/blob/factory/factory = null
var/is_zombie = 0
faction = "blob"
min_oxy = 0
max_oxy = 0
@@ -70,10 +71,57 @@
factory.spores += src
..()
Die()
del(src)
/mob/living/simple_animal/hostile/blobspore/Life()
Del()
if(factory)
factory.spores -= src
..()
if(!is_zombie)
for(var/mob/living/carbon/human/H in ListTargets(0)) //Only for people in the same tile
if(H.stat == DEAD)
Zombify(H)
break
..()
/mob/living/simple_animal/hostile/blobspore/proc/Zombify(var/mob/living/carbon/human/H)
if(H.wear_suit)
var/obj/item/clothing/suit/armor/A = H.wear_suit
if(A.armor && A.armor["melee"])
maxHealth += A.armor["melee"] //That zombie's got armor, I want armor!
maxHealth += 40
health = maxHealth
name = "blob zombie"
desc = "A shambling corpse animated by the blob."
melee_damage_lower = 10
melee_damage_upper = 15
icon = H.icon
icon_state = "husk_s"
H.h_style = null
H.update_hair()
overlays = H.overlays
overlays += image('icons/mob/blob.dmi', icon_state = "blob_head")
H.loc = src
is_zombie = 1
loc.visible_message("<span class='warning'> The corpse of [H.name] suddenly rises!</span>")
/mob/living/simple_animal/hostile/blobspore/Die()
// On death, create a small smoke of harmful gas (s-Acid)
var/datum/effect/effect/system/chem_smoke_spread/S = new
var/turf/location = get_turf(src)
// Create the reagents to put into the air, s-acid is yellow and stings a little
create_reagents(25)
reagents.add_reagent("spore", 25)
// Attach the smoke spreader and setup/start it.
S.attach(location)
S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud
S.start()
del(src)
/mob/living/simple_animal/hostile/blobspore/Del()
if(factory)
factory.spores -= src
if(contents)
for(var/mob/M in contents)
M.loc = src.loc
..()
+8 -3
View File
@@ -142,21 +142,23 @@
/obj/effect/biomass/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
return
if(2.0)
if (prob(90))
del(src)
qdel(src)
return
if(3.0)
if (prob(50))
del(src)
qdel(src)
return
return
/obj/effect/biomass/temperature_expose(null, temp, volume) //hotspots kill biomass
del src
/datum/event/biomass/start()
biomass_infestation()
/proc/biomass_infestation()
@@ -173,3 +175,6 @@
var/turf/simulated/floor/T = pick(turfs)
new/obj/effect/biomass_controller(T) //spawn a controller at turf
message_admins("\blue Event: Biomass spawned at [T.loc.loc] ([T.x],[T.y],[T.z])")
+1 -1
View File
@@ -118,5 +118,5 @@ The "dust" will damage the hull of the station causin minor hull breaches.
ex_act(severity)
del(src)
qdel(src)
return
+34 -34
View File
@@ -68,12 +68,12 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo
//=======//9-8 TILE TELEPORT//=======//
//Click to to teleport 9-10 tiles in direction facing.
/obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt()
set name = "Phase Jaunt (250E)"
set name = "Phase Jaunt (500E)"
set desc = "Utilizes the internal VOID-shift device to rapidly transit in direction facing."
set category = "Ninja Ability"
set popup_menu = 0
var/C = 200
var/C = 500
if(!ninjacost(C,1))
var/mob/living/carbon/human/U = affecting
var/turf/destination = get_teleport_loc(U.loc,U,9,1,3,1,0,1)
@@ -108,12 +108,12 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo
//=======//RIGHT CLICK TELEPORT//=======//
//Right click to teleport somewhere, almost exactly like admin jump to turf.
/obj/item/clothing/suit/space/space_ninja/proc/ninjashift(turf/T in oview())
set name = "Phase Shift (500E)"
set name = "Phase Shift (750E)"
set desc = "Utilizes the internal VOID-shift device to rapidly transit to a destination in view."
set category = null//So it does not show up on the panel but can still be right-clicked.
set src = usr.contents//Fixes verbs not attaching properly for objects. Praise the DM reference guide!
var/C = 400
var/C = 750
if(!ninjacost(C,1))
var/mob/living/carbon/human/U = affecting
var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below.
@@ -230,46 +230,46 @@ This could be a lot better but I'm too tired atm.*/
/*Allows the ninja to capture people, I guess.
Must right click on a mob to activate.*/
/obj/item/clothing/suit/space/space_ninja/proc/ninjanet(mob/living/carbon/M in oview())//Only living carbon mobs.
set name = "Energy Net (5,000E)"
set name = "Energy Net (2,500E)"
set desc = "Captures a fallen opponent in a net of energy. Will teleport them to a holding facility after 30 seconds."
set category = null
set src = usr.contents
var/C = 5000
var/C = 2500
if(!ninjacost(C,1)&&iscarbon(M)) // Nets now cost 8,000
var/mob/living/carbon/human/U = affecting
//if(M.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
if(M.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
//if(M)//DEBUG
if(!locate(/obj/effect/energy_net) in M.loc)//Check if they are already being affected by an energy net.
for(var/turf/T in getline(U.loc, M.loc))
if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
U << "You may not use an energy net through solid obstacles!"
return
spawn(0)
U.Beam(M,"n_beam",,15)
M.anchored = 1//Anchors them so they can't move.
var/obj/effect/stop/S
S = new /obj/effect/stop
S.victim = M
S.loc = M.loc
if(!locate(/obj/effect/energy_net) in M.loc)//Check if they are already being affected by an energy net.
for(var/turf/T in getline(U.loc, M.loc))
if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
U << "You may not use an energy net through solid obstacles!"
return
spawn(0)
U.Beam(M,"n_beam",,15)
M.anchored = 1//Anchors them so they can't move.
var/obj/effect/stop/S
S = new /obj/effect/stop
S.victim = M
S.loc = M.loc
var/obj/effect/energy_net/E = new /obj/effect/energy_net(M.loc)
E.layer = M.layer+1//To have it appear one layer above the mob.
for(var/mob/O in viewers(U, 3))
O.show_message(text("\red [] caught [] with an energy net!", U, M), 1)
E.affecting = M
E.master = U
spawn(0)//Parallel processing.
E.process(M)
cell.charge-=(C)
var/obj/effect/energy_net/E = new /obj/effect/energy_net(M.loc)
E.layer = M.layer+1//To have it appear one layer above the mob.
for(var/mob/O in viewers(U, 3))
O.show_message(text("\red [] caught [] with an energy net!", U, M), 1)
E.affecting = M
E.master = U
spawn(0)//Parallel processing.
E.process(M)
cell.charge-=(C)
else
U << "They are already trapped inside an energy net."
else
U << "They are already trapped inside an energy net."
//else
//U << "They will bring no honor to your Clan!"
U << "They will bring no honor to your Clan!"
return
//=======//ADRENALINE BOOST//=======//
/*Wakes the user so they are able to do their thing. Also injects a decent dose of radium.
/*Wakes the user so they are able to do their thing. Also injects a decent dose of uranium.
Movement impairing would indicate drugs and the like.*/
/obj/item/clothing/suit/space/space_ninja/proc/ninjaboost()
set name = "Adrenaline Boost"
@@ -280,7 +280,7 @@ Movement impairing would indicate drugs and the like.*/
if(!ninjacost(,3))//Have to make sure stat is not counted for this ability.
var/mob/living/carbon/human/U = affecting
//Wouldn't need to track adrenaline boosters if there was a miracle injection to get rid of paralysis and the like instantly.
//For now, adrenaline boosters ARE the miracle injection. Well, radium, really.
//For now, adrenaline boosters ARE the miracle injection. Well, uranium, really.
U.SetParalysis(0)
U.SetStunned(0)
U.SetWeakened(0)
@@ -297,7 +297,7 @@ Movement impairing would indicate drugs and the like.*/
U.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!"))
spawn(70)
reagents.reaction(U, 2)
reagents.trans_id_to(U, "radium", a_transfer)
reagents.trans_id_to(U, "uranium", a_transfer)
U << "\red You are beginning to feel the after-effect of the injection."
a_boost--
s_coold = 3
+30 -86
View File
@@ -23,7 +23,6 @@ ________________________________________________________________________________
verbs += /obj/item/clothing/suit/space/space_ninja/proc/init//suit initialize verb
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_instruction//for AIs
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_holo
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_overrideninja // Experemental
//verbs += /obj/item/clothing/suit/space/space_ninja/proc/display_verb_procs//DEBUG. Doesn't work.
spark_system = new()//spark initialize
spark_system.set_up(5, 0, src)
@@ -33,11 +32,11 @@ ________________________________________________________________________________
stored_research += new T(src)
var/reagent_amount//reagent initialize
for(var/reagent_id in reagent_list)
reagent_amount += reagent_id == "radium" ? r_maxamount+(a_boost*a_transfer) : r_maxamount//AI can inject radium directly.
reagent_amount += reagent_id == "uranium" ? r_maxamount+(a_boost*a_transfer) : r_maxamount//AI can inject uranium directly.
reagents = new(reagent_amount)
reagents.my_atom = src
for(var/reagent_id in reagent_list)
reagent_id == "radium" ? reagents.add_reagent(reagent_id, r_maxamount+(a_boost*a_transfer)) : reagents.add_reagent(reagent_id, r_maxamount)//It will take into account radium used for adrenaline boosting.
reagent_id == "uranium" ? reagents.add_reagent(reagent_id, r_maxamount+(a_boost*a_transfer)) : reagents.add_reagent(reagent_id, r_maxamount)//It will take into account uranium used for adrenaline boosting.
cell = new/obj/item/weapon/cell/high//The suit should *always* have a battery because so many things rely on it.
cell.charge = 9000//Starting charge should not be higher than maximum charge. It leads to problems with recharging.
@@ -187,6 +186,7 @@ ________________________________________________________________________________
unlock_suit()
break
lock_suit(U,1)//Check for icons.
U.hud_used.human_hud('icons/mob/screen1_NinjaHUD.dmi',"#ffffff",255)
U.regenerate_icons()
U << "\blue Linking neural-net interface...\nPattern \green <B>GREEN</B>\blue, continuing operation."
if(4)
@@ -239,6 +239,8 @@ ________________________________________________________________________________
cancel_stealth()//Shutdowns stealth.
if(4)
U << "\blue Disconnecting neural-net interface...\green<B>Success</B>\blue."
U.hud_used.instantiate()
U.regenerate_icons()
if(5)
U << "\blue Disengaging neural-net interface...\green<B>Success</B>\blue."
if(6)
@@ -318,9 +320,9 @@ ________________________________________________________________________________
dat += "Warning: Virus Detected. Name: [D.name].Type: [D.spread]. Stage: [D.stage]/[D.max_stages]. Possible Cure: [D.cure].<br>"
dat += "<ul>"
for(var/datum/reagent/R in reagents.reagent_list)
if(R.id=="radium"&&s_control)//Can only directly inject radium when AI is in control.
if(R.id=="uranium"&&s_control)//Can only directly inject uranium when AI is in control.
continue
dat += "<li><a href='byond://?src=\ref[src];choice=Inject;name=[R.name];tag=[R.id]'><img src=sos_2.png> Inject [R.name]: [(reagents.get_reagent_amount(R.id)-(R.id=="radium"?(a_boost*a_transfer):0))/(R.id=="nutriment"?5:a_transfer)] left</a></li>"
dat += "<li><a href='byond://?src=\ref[src];choice=Inject;name=[R.name];tag=[R.id]'><img src=sos_2.png> Inject [R.name]: [(reagents.get_reagent_amount(R.id)-(R.id=="uranium"?(a_boost*a_transfer):0))/(R.id=="nutriment"?5:a_transfer)] left</a></li>"
dat += "</ul>"
if(1)
dat += "<h4><img src=sos_5.png> Atmospheric Scan:</h4>"//Headers don't need breaks. They are automatically placed.
@@ -407,12 +409,12 @@ ________________________________________________________________________________
</ul>
<b>Abilities</b>:
<ul>
<li>*<b>Phase Shift</b> (<i>500E</i>) and <b>Phase Jaunt</b> (<i>250E</i>) are unique powers in that they can both be used for defense and offense. Jaunt launches the ninja forward facing up to 9 squares, somewhat randomly selecting the final destination. Shift can only be used on turf in view but is precise (cannot be used on walls). Any living mob in the area teleported to is instantly gibbed (mechs are damaged, huggers and other similar critters are killed). It is possible to teleport with a target, provided you grab them before teleporting. </li>
<li>*<b>Phase Shift</b> (<i>750E</i>) and <b>Phase Jaunt</b> (<i>500E</i>) are unique powers in that they can both be used for defense and offense. Jaunt launches the ninja forward facing up to 9 squares, somewhat randomly selecting the final destination. Shift can only be used on turf in view but is precise (cannot be used on walls). It is possible to teleport with a target, provided you grab them before teleporting. </li>
<li>*<b>Energy Blade</b> (<i>200E</i>) is a highly effective weapon. It is summoned directly to the ninja's hand and can also function as an EMAG for certain objects (doors/lockers/etc). You may also use it to cut through walls and disabled doors. Experiment! The blade will crit humans in two hits. This item cannot be placed in containers and when dropped or thrown disappears. Having an energy blade drains more power from the battery each tick.</li>
<li>*<b>EM Pulse</b> (<i>1000E</i>) is a highly useful ability that will create an electromagnetic shockwave around the ninja, disabling technology whenever possible. If used properly it can render a security force effectively useless. Of course, getting beat up with a toolbox is not accounted for.</li>
<li>*<b>Energy Star</b> (<i>500E</i>) is a ninja star made of green energy AND coated in poison. It works by picking a random living target within range and can be spammed to great effect in incapacitating foes. Just remember that the poison used is also used by the Xeno Hivemind (and will have no effect on them).</li>
<li>*<b>Energy Net</b> (<i>5000E</i>) is a non-lethal solution to incapacitating humanoids. The net is made of non-harmful phase energy and will halt movement as long as it remains in effect--it can be destroyed. If the net is not destroyed, after a certain time it will teleport the target to a holding facility for the Spider Clan and then vanish. You will be notified if the net fails or succeeds in capturing a target in this manner. Combine with energy stars or stripping to ensure success. Abduction never looked this leet.</li>
<li>*<b>Adrenaline Boost</b> (<i>1 E. Boost/3</i>) recovers the user from stun, weakness, and paralysis. Also injects 20 units of radium into the bloodstream.</li>
<li>*<b>Energy Net</b> (<i>2000E</i>) is a non-lethal solution to incapacitating humanoids. The net is made of non-harmful phase energy and will halt movement as long as it remains in effect--it can be destroyed. If the net is not destroyed, after a certain time it will teleport the target to a holding facility for the Spider Clan and then vanish. You will be notified if the net fails or succeeds in capturing a target in this manner. Combine with energy stars or stripping to ensure success. Abduction never looked this leet.</li>
<li>*<b>Adrenaline Boost</b> (<i>1 E. Boost/3</i>) recovers the user from stun, weakness, and paralysis. Also injects 20 units of uranium into the bloodstream.</li>
<li>*<b>Smoke Bomb</b> (<i>1 Sm.Bomb/10</i>) is a weak but potentially useful ability. It creates harmful smoke and can be used in tandem with other powers to confuse enemies.</li>
<li>*<b>???</b>: unleash the <b>True Ultimate Power!</b></li>
<h4>IMPORTANT:</h4>
@@ -466,12 +468,12 @@ ________________________________________________________________________________
dat += {"
<h4><img src=sos_6.png> Activate Abilities:</h4>
<ul>
<li><a href='byond://?src=\ref[src];choice=Trigger Ability;name=Phase Jaunt;cost= (10E)'><img src=sos_13.png> Phase Jaunt</a></li>
<li><a href='byond://?src=\ref[src];choice=Trigger Ability;name=Phase Shift;cost= (20E)'><img src=sos_13.png> Phase Shift</a></li>
<li><a href='byond://?src=\ref[src];choice=Trigger Ability;name=Energy Blade;cost= (5E)'><img src=sos_13.png> Energy Blade</a></li>
<li><a href='byond://?src=\ref[src];choice=Trigger Ability;name=Energy Star;cost= (5E)'><img src=sos_13.png> Energy Star</a></li>
<li><a href='byond://?src=\ref[src];choice=Trigger Ability;name=Energy Net;cost= (20E)'><img src=sos_13.png> Energy Net</a></li>
<li><a href='byond://?src=\ref[src];choice=Trigger Ability;name=EM Burst;cost= (25E)'><img src=sos_13.png> EM Pulse</a></li>
<li><a href='byond://?src=\ref[src];choice=Trigger Ability;name=Phase Jaunt;cost= (500E)'><img src=sos_13.png> Phase Jaunt</a></li>
<li><a href='byond://?src=\ref[src];choice=Trigger Ability;name=Phase Shift;cost= (750E)'><img src=sos_13.png> Phase Shift</a></li>
<li><a href='byond://?src=\ref[src];choice=Trigger Ability;name=Energy Blade;cost= (200E)'><img src=sos_13.png> Energy Blade</a></li>
<li><a href='byond://?src=\ref[src];choice=Trigger Ability;name=Energy Star;cost= (500E)'><img src=sos_13.png> Energy Star</a></li>
<li><a href='byond://?src=\ref[src];choice=Trigger Ability;name=Energy Net;cost= (2500E)'><img src=sos_13.png> Energy Net</a></li>
<li><a href='byond://?src=\ref[src];choice=Trigger Ability;name=EM Burst;cost= (1000E)'><img src=sos_13.png> EM Pulse</a></li>
<li><a href='byond://?src=\ref[src];choice=Trigger Ability;name=Smoke Bomb;cost='><img src=sos_13.png> Smoke Bomb</a></li>
<li><a href='byond://?src=\ref[src];choice=Trigger Ability;name=Adrenaline Boost;cost='><img src=sos_13.png> Adrenaline Boost</a></li>
</ul>
@@ -559,8 +561,19 @@ ________________________________________________________________________________
P.overlays.Cut()
P.overlays += image('icons/obj/pda.dmi', "pda-r")
var/mob/living/L = null
if(P.loc && isliving(P.loc))
L = P.loc
//Maybe they are a pAI!
else
L = get(P, /mob/living/silicon)
if(L)
L << "\icon[P] <b>Message from [!s_control?(A):"an unknown source"], </b>\"[t]\" (<i>Unable to Reply</i>)"
if("Inject")
if( (href_list["tag"]=="radium"? (reagents.get_reagent_amount("radium"))<=(a_boost*a_transfer) : !reagents.get_reagent_amount(href_list["tag"])) )//Special case for radium. If there are only a_boost*a_transfer radium units left.
if( (href_list["tag"]=="uranium"? (reagents.get_reagent_amount("uranium"))<=(a_boost*a_transfer) : !reagents.get_reagent_amount(href_list["tag"])) )//Special case for uranium. If there are only a_boost*a_transfer uranium units left.
display_to << "\red Error: the suit cannot perform this function. Out of [href_list["name"]]."
else
reagents.reaction(U, 2)
@@ -700,7 +713,6 @@ ________________________________________________________________________________
if(4)
A << "Connection established and secured. Menu updated."
U << "\red <b>Wr#nING</b>: #%@!!WȆ|_454@ \nUnB88l3 T L-o-LCaT2 ##$!RN0..%.."
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_overrideninja // To stop AIs from overriding an overridden Ninja. -- Dave
grant_AI_verbs()
return
sleep(s_delay)
@@ -810,54 +822,9 @@ ________________________________________________________________________________
AI << "You have ceased your hacking attempt. [affecting.real_name] has regained control."
affecting << "<b>UPDATE</b>: [AI.real_name] has ceased hacking attempt. All systems clear."
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_overrideninja
remove_AI_verbs()
return
/obj/item/clothing/suit/space/space_ninja/proc/ai_overrideninja()// Experemental -- Dave
set name = "Hack Ninja Systems"
set desc = "Hack directly into the Black Widow(tm) neuro-interface."
set category = "AI Ninja Equip"
set src = usr.loc
var/mob/living/carbon/human/U = affecting
var/mob/living/silicon/ai/A = AI
if(A.laws != new /datum/ai_laws/ninja_override && s_busy == 0)
s_busy = 1
for(var/i,i<6,i++)
if(AI==A)
switch(i)
if(1)
A << "\blue <b>NOTICE</b>:\black Beginning hack attempt..."
U << "\red <b>WARNING</b>: HACKING ATTEMP IN PR0GRESs!"
spideros = 0
k_unlock = 0
U << browse(null, "window=spideros")
if(2)
A << "<b>Disconnecting neural interface...</b>"
U << "\red <b>WARNING</b>: RO0Gr--S 2&3%"
if(3)
A << "<b>Shutting down external protocol...</b>"
U << "\red <b>WARNING</b>: PRֆGr5S 677^%"
cancel_stealth()
if(4)
A << "<b>Connecting to kernel...</b>"
U << "\red <b>WARNING</b>: RrR_404"
A.control_disabled = 0
if(5)
A << "<b>Connection established and secured. Menu updated.</b>"
U << "\red <b>Wr#nING</b>: #%@!!WȆ|_454@ \nUnB88l3 T L-o-LCaT2 ##$!RN0..%.."
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_overrideninja
grant_AI_verbs()
return
sleep(s_delay)
else break
s_busy = 0
else
A << "\red<b>ALERT</b>:\black Current lawset prevents hacking!"
//=======//GENERAL SUIT PROCS//=======//
/obj/item/clothing/suit/space/space_ninja/attackby(obj/item/I, mob/U)
@@ -879,9 +846,9 @@ ________________________________________________________________________________
var/total_reagent_transfer//Keep track of this stuff.
for(var/reagent_id in reagent_list)
var/datum/reagent/R = I.reagents.has_reagent(reagent_id)//Mostly to pull up the name of the reagent after calculating. Also easier to use than writing long proc paths.
if(R&&reagents.get_reagent_amount(reagent_id)<r_maxamount+(reagent_id == "radium"?(a_boost*a_transfer):0)&&R.volume>=a_transfer)//Radium is always special.
if(R&&reagents.get_reagent_amount(reagent_id)<r_maxamount+(reagent_id == "uranium"?(a_boost*a_transfer):0)&&R.volume>=a_transfer)//Uranium is always special.
//Here we determine how much reagent will actually transfer if there is enough to transfer or there is a need of transfer. Minimum of max amount available (using a_transfer) or amount needed.
var/amount_to_transfer = min( (r_maxamount+(reagent_id == "radium"?(a_boost*a_transfer):0)-reagents.get_reagent_amount(reagent_id)) ,(round(R.volume/a_transfer))*a_transfer)//In the end here, we round the amount available, then multiply it again.
var/amount_to_transfer = min( (r_maxamount+(reagent_id == "uranium"?(a_boost*a_transfer):0)-reagents.get_reagent_amount(reagent_id)) ,(round(R.volume/a_transfer))*a_transfer)//In the end here, we round the amount available, then multiply it again.
R.volume -= amount_to_transfer//Remove from reagent volume. Don't want to delete the reagent now since we need to perserve the name.
reagents.add_reagent(reagent_id, amount_to_transfer)//Add to suit. Reactions are not important.
total_reagent_transfer += amount_to_transfer//Add to total reagent trans.
@@ -1206,29 +1173,6 @@ ________________________________________________________________________________
/*
Experimenting with a wrist-mounted hypospray for delivering hallucigenics. Todo: Possibly make it only work on harm intent.
-- Dave
*/
if("HUMAN")
var/mob/living/carbon/human/A = target
if(S.h_stings > 0)
if(A != U) // Because it's bound to happen.
S.h_stings -= 1
A <<"\red You feel a tiny prick, something doesn't feel right..."
U <<"\blue Hallucigen administered to [A], you have <b>[S.h_stings]</b> doses left."
A.hallucination += 300
else
U <<"\red You think for a moment, and decide may not be wise to inject yourself."
else
U<<"\red You are out of stings!"
if("CYBORG")
var/mob/living/silicon/robot/A = target
A << "\red Warning: Unauthorized access through sub-route 12, block C, detected."
+1 -1
View File
@@ -90,7 +90,7 @@ I decided to scrap round-specific objectives since keeping track of them would r
When I already created about 4 new objectives, this doesn't seem terribly important or needed.
*/
/var/global/toggle_space_ninja = 0//If ninjas can spawn or not.
/var/global/toggle_space_ninja = 1//If ninjas can spawn or not.
/var/global/sent_ninja_to_station = 0//If a ninja is already on the station.
var/ninja_selection_id = 1
+3 -3
View File
@@ -227,15 +227,15 @@
/obj/effect/spacevine/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
return
if(2.0)
if (prob(90))
del(src)
qdel(src)
return
if(3.0)
if (prob(50))
del(src)
qdel(src)
return
return
+1 -1
View File
@@ -114,7 +114,7 @@
/obj/effect/meteor/ex_act(severity)
if (severity < 4)
del(src)
qdel(src)
return
/obj/effect/meteor/big
+1 -1
View File
@@ -1415,7 +1415,7 @@ datum
check_completion()//Basically runs through all the mobs in the area to determine how much they are worth.
var/captured_amount = 0
var/area/centcom/holding/A = locate()
var/area/ninja/holding/A = locate()
for(var/mob/living/carbon/human/M in A)//Humans.
if(M.stat==2)//Dead folks are worth less.
captured_amount+=0.5
+1 -1
View File
@@ -566,7 +566,7 @@ datum/objective/capture
check_completion()//Basically runs through all the mobs in the area to determine how much they are worth.
var/captured_amount = 0
var/area/centcom/holding/A = locate()
var/area/ninja/holding/A = locate()
for(var/mob/living/carbon/human/M in A)//Humans.
if(M.stat==2)//Dead folks are worth less.
captured_amount+=0.5
+14 -1
View File
@@ -1,4 +1,7 @@
/proc/getAssignedBlock(var/name,var/list/blocksLeft, var/activity_bounds=DNA_DEFAULT_BOUNDS)
if(blocksLeft.len==0)
warning("[name]: No more blocks left to assign!")
return 0
var/assigned = pick(blocksLeft)
blocksLeft.Remove(assigned)
assigned_blocks[assigned]=name
@@ -77,6 +80,14 @@
PSYRESISTBLOCK = getAssignedBlock("PSYRESIST", numsToAssign, DNA_HARD_BOUNDS)
SHADOWBLOCK = getAssignedBlock("SHADOW", numsToAssign, DNA_HARDER_BOUNDS)
CHAMELEONBLOCK = getAssignedBlock("CHAMELEON", numsToAssign, DNA_HARDER_BOUNDS)
CRYOBLOCK = getAssignedBlock("CRYO", numsToAssign, DNA_HARD_BOUNDS)
EATBLOCK = getAssignedBlock("EAT", numsToAssign, DNA_HARD_BOUNDS)
JUMPBLOCK = getAssignedBlock("JUMP", numsToAssign, DNA_HARD_BOUNDS)
MELTBLOCK = getAssignedBlock("MELT", numsToAssign)
IMMOLATEBLOCK = getAssignedBlock("IMMOLATE", numsToAssign)
EMPATHBLOCK = getAssignedBlock("EMPATH", numsToAssign, DNA_HARD_BOUNDS)
SUPERFARTBLOCK = getAssignedBlock("SUPERFART", numsToAssign, DNA_HARDER_BOUNDS)
POLYMORPHBLOCK = getAssignedBlock("POLYMORPH", numsToAssign, DNA_HARDER_BOUNDS)
//
// Static Blocks
@@ -98,7 +109,9 @@
assignedToBlock=blocks_assigned[G.block]
assignedToBlock.Add(G.name)
blocks_assigned[G.block]=assignedToBlock
testing("DNA2: Gene [G.name] assigned to block [G.block].")
//testing("DNA2: Gene [G.name] assigned to block [G.block].")
testing("DNA2: [numsToAssign.len] blocks are unused: [english_list(numsToAssign)]")
// Run AFTER genetics setup and AFTER species setup.
/proc/setup_species()
-5
View File
@@ -40,11 +40,6 @@
typepath = /obj/item/weapon/rcd
protected_jobs = list("Chief Engineer")
/datum/theft_objective/rpd
name = "an RPD"
typepath = /obj/item/weapon/pipe_dispenser
protected_jobs = list("Chief Engineer")
/datum/theft_objective/jetpack
name = "a jetpack"
typepath = /obj/item/weapon/tank/jetpack
+9 -10
View File
@@ -85,14 +85,9 @@
kill_objective.find_target()
traitor.objectives += kill_objective
if(prob(25))
var/datum/objective/die/die_objective = new
die_objective.owner = traitor
traitor.objectives += die_objective
else
var/datum/objective/survive/survive_objective = new
survive_objective.owner = traitor
traitor.objectives += survive_objective
var/datum/objective/survive/survive_objective = new
survive_objective.owner = traitor
traitor.objectives += survive_objective
if(prob(10))
var/datum/objective/block/block_objective = new
@@ -122,12 +117,16 @@
steal_objective.find_target()
traitor.objectives += steal_objective
switch(rand(1,100))
if(1 to 100)
if(1 to 30) // Die glorious death
if (!(locate(/datum/objective/die) in traitor.objectives))
var/datum/objective/die/die_objective = new
die_objective.owner = traitor
traitor.objectives += die_objective
if(31 to 90)
if (!(locate(/datum/objective/escape) in traitor.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = traitor
traitor.objectives += escape_objective
else
if(prob(50))
if (!(locate(/datum/objective/hijack) in traitor.objectives))
+20 -20
View File
@@ -217,9 +217,9 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
if(!mind.vampire)
mind.vampire = new /datum/vampire(gender)
mind.vampire.owner = src
verbs += /client/proc/vampire_rejuvinate
verbs += /client/proc/vampire_hypnotise
verbs += /client/proc/vampire_glare
verbs += /client/vampire/proc/vampire_rejuvinate
verbs += /client/vampire/proc/vampire_hypnotise
verbs += /client/vampire/proc/vampire_glare
//testing purposes REMOVE BEFORE PUSH TO MASTER
/*for(var/handler in typesof(/client/proc))
if(findtext("[handler]","vampire_"))
@@ -232,27 +232,27 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
for(var/n in mind.vampire.powers)
switch(n)
if(VAMP_SHAPE)
verbs += /client/proc/vampire_shapeshift
verbs += /client/vampire/proc/vampire_shapeshift
if(VAMP_VISION)
continue
if(VAMP_DISEASE)
verbs += /client/proc/vampire_disease
verbs += /client/vampire/proc/vampire_disease
if(VAMP_CLOAK)
verbs += /client/proc/vampire_cloak
verbs += /client/vampire/proc/vampire_cloak
if(VAMP_BATS)
verbs += /client/proc/vampire_bats
verbs += /client/vampire/proc/vampire_bats
if(VAMP_SCREAM)
verbs += /client/proc/vampire_screech
verbs += /client/vampire/proc/vampire_screech
if(VAMP_JAUNT)
verbs += /client/proc/vampire_jaunt
verbs += /client/vampire/proc/vampire_jaunt
if(VAMP_BLINK)
verbs += /client/proc/vampire_shadowstep
verbs += /client/vampire/proc/vampire_shadowstep
if(VAMP_SLAVE)
verbs += /client/proc/vampire_enthrall
verbs += /client/vampire/proc/vampire_enthrall
if(VAMP_FULL)
continue
/mob/proc/remove_vampire_powers()
for(var/handler in typesof(/client/proc))
for(var/handler in typesof(/client/vampire/proc))
if(findtext("[handler]","vampire_"))
verbs -= handler
@@ -355,31 +355,31 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
switch(n)
if(VAMP_SHAPE)
src << "\blue You have gained the shapeshifting ability, at the cost of stored blood you can change your form permanently."
verbs += /client/proc/vampire_shapeshift
verbs += /client/vampire/proc/vampire_shapeshift
if(VAMP_VISION)
src << "\blue Your vampiric vision has improved."
//no verb
if(VAMP_DISEASE)
src << "\blue You have gained the Diseased Touch ability which causes those you touch to die shortly after unless treated medically."
verbs += /client/proc/vampire_disease
verbs += /client/vampire/proc/vampire_disease
if(VAMP_CLOAK)
src << "\blue You have gained the Cloak of Darkness ability which when toggled makes you near invisible in the shroud of darkness."
verbs += /client/proc/vampire_cloak
verbs += /client/vampire/proc/vampire_cloak
if(VAMP_BATS)
src << "\blue You have gained the Summon Bats ability."
verbs += /client/proc/vampire_bats // work in progress
verbs += /client/vampire/proc/vampire_bats // work in progress
if(VAMP_SCREAM)
src << "\blue You have gained the Chriopteran Screech ability which stuns anything with ears in a large radius and shatters glass in the process."
verbs += /client/proc/vampire_screech
verbs += /client/vampire/proc/vampire_screech
if(VAMP_JAUNT)
src << "\blue You have gained the Mist Form ability which allows you to take on the form of mist for a short period and pass over any obstacle in your path."
verbs += /client/proc/vampire_jaunt
verbs += /client/vampire/proc/vampire_jaunt
if(VAMP_SLAVE)
src << "\blue You have gained the Enthrall ability which at a heavy blood cost allows you to enslave a human that is not loyal to any other for a random period of time."
verbs += /client/proc/vampire_enthrall
verbs += /client/vampire/proc/vampire_enthrall
if(VAMP_BLINK)
src << "\blue You have gained the ability to shadowstep, which makes you disappear into nearby shadows at the cost of blood."
verbs += /client/proc/vampire_shadowstep
verbs += /client/vampire/proc/vampire_shadowstep
if(VAMP_FULL)
src << "\blue You have reached your full potential and are no longer weak to the effects of anything holy and your vision has been improved greatly."
//no verb
+31 -31
View File
@@ -68,7 +68,7 @@
if(!vampire_power(required_blood, max_stat)) return
return T
/client/proc/vampire_rejuvinate()
/client/vampire/proc/vampire_rejuvinate()
set category = "Vampire"
set name = "Rejuvinate "
set desc= "Flush your system with spare blood to remove any incapacitating effects"
@@ -88,11 +88,11 @@
M.current.adjustToxLoss(-2)
M.current.adjustFireLoss(-2)
sleep(35)
M.current.verbs -= /client/proc/vampire_rejuvinate
M.current.verbs -= /client/vampire/proc/vampire_rejuvinate
spawn(200)
M.current.verbs += /client/proc/vampire_rejuvinate
M.current.verbs += /client/vampire/proc/vampire_rejuvinate
/client/proc/vampire_hypnotise()
/client/vampire/proc/vampire_hypnotise()
set category = "Vampire"
set name = "Hypnotise (20)"
set desc= "A piercing stare that incapacitates your victim for a good length of time."
@@ -104,9 +104,9 @@
if(!C) return
M.current.visible_message("<span class='warning'>[M]'s eyes flash briefly as he stares into [C.name]'s eyes</span>")
M.current.remove_vampire_blood(20)
M.current.verbs -= /client/proc/vampire_hypnotise
M.current.verbs -= /client/vampire/proc/vampire_hypnotise
spawn(1800)
M.current.verbs += /client/proc/vampire_hypnotise
M.current.verbs += /client/vampire/proc/vampire_hypnotise
if(do_mob(M.current, C, 50))
if(C.mind && C.mind.vampire)
M.current << "\red Your piercing gaze fails to knock out [C.name]."
@@ -122,7 +122,7 @@
M.current << "\red You broke your gaze."
return
/client/proc/vampire_disease()
/client/vampire/proc/vampire_disease()
set category = "Vampire"
set name = "Diseased Touch (100)"
set desc = "Touches your victim with infected blood giving them the Shutdown Syndrome which quickly shutsdown their major organs resulting in a quick painful death."
@@ -162,10 +162,10 @@
shutdown.clicks = 185
infect_virus2(C,shutdown,0)
M.current.remove_vampire_blood(100)
M.current.verbs -= /client/proc/vampire_disease
spawn(1800) M.current.verbs += /client/proc/vampire_disease
M.current.verbs -= /client/vampire/proc/vampire_disease
spawn(1800) M.current.verbs += /client/vampire/proc/vampire_disease
/client/proc/vampire_glare()
/client/vampire/proc/vampire_glare()
set category = "Vampire"
set name = "Glare"
set desc= "A scary glare that incapacitates people for a short while around you."
@@ -174,9 +174,9 @@
if(M.current.vampire_power(0, 1))
M.current.visible_message("\red <b>[M.current]'s eyes emit a blinding flash!")
//M.vampire.bloodusable -= 10
M.current.verbs -= /client/proc/vampire_glare
M.current.verbs -= /client/vampire/proc/vampire_glare
spawn(300)
M.current.verbs += /client/proc/vampire_glare
M.current.verbs += /client/vampire/proc/vampire_glare
if(istype(M.current:glasses, /obj/item/clothing/glasses/sunglasses/blindfold))
M.current << "<span class='warning'>You're blindfolded!</span>"
return
@@ -188,7 +188,7 @@
C.stuttering = 20
C << "\red You are blinded by [M.current]'s glare"
/client/proc/vampire_shapeshift()
/client/vampire/proc/vampire_shapeshift()
set category = "Vampire"
set name = "Shapeshift (50)"
set desc = "Changes your name and appearance at the cost of 50 blood and has a cooldown of 3 minutes."
@@ -200,10 +200,10 @@
M.current.client.prefs.randomize_appearance_for(M.current)
M.current.regenerate_icons()
M.current.remove_vampire_blood(50)
M.current.verbs -= /client/proc/vampire_shapeshift
spawn(1800) M.current.verbs += /client/proc/vampire_shapeshift
M.current.verbs -= /client/vampire/proc/vampire_shapeshift
spawn(1800) M.current.verbs += /client/vampire/proc/vampire_shapeshift
/client/proc/vampire_screech()
/client/vampire/proc/vampire_screech()
set category = "Vampire"
set name = "Chiroptean Screech (30)"
set desc = "An extremely loud shriek that stuns nearby humans and breaks windows as well."
@@ -227,10 +227,10 @@
del(W)
playsound(M.current.loc, 'sound/effects/creepyshriek.ogg', 100, 1)
M.current.remove_vampire_blood(30)
M.current.verbs -= /client/proc/vampire_screech
spawn(1800) M.current.verbs += /client/proc/vampire_screech
M.current.verbs -= /client/vampire/proc/vampire_screech
spawn(1800) M.current.verbs += /client/vampire/proc/vampire_screech
/client/proc/vampire_enthrall()
/client/vampire/proc/vampire_enthrall()
set category = "Vampire"
set name = "Enthrall (300)"
set desc = "You use a large portion of your power to sway those loyal to none to be loyal to you only."
@@ -248,15 +248,15 @@
if(M.current.can_enthrall(C) && M.current.vampire_power(300, 0)) // recheck
M.current.handle_enthrall(C)
M.current.remove_vampire_blood(300)
M.current.verbs -= /client/proc/vampire_enthrall
spawn(1800) M.current.verbs += /client/proc/vampire_enthrall
M.current.verbs -= /client/vampire/proc/vampire_enthrall
spawn(1800) M.current.verbs += /client/vampire/proc/vampire_enthrall
else
M.current << "\red You or your target either moved or you dont have enough usable blood."
return
/client/proc/vampire_cloak()
/client/vampire/proc/vampire_cloak()
set category = "Vampire"
set name = "Cloak of Darkness (toggle)"
set desc = "Toggles whether you are currently cloaking yourself in darkness."
@@ -319,7 +319,7 @@
ticker.mode.update_vampire_icons_added(src.mind)
log_admin("[ckey(src.key)] has mind-slaved [ckey(H.key)].")
/client/proc/vampire_bats()
/client/vampire/proc/vampire_bats()
set category = "Vampire"
set name = "Summon Bats (75)"
set desc = "You summon a pair of space bats who attack nearby targets until they or their target is dead."
@@ -344,10 +344,10 @@
new /mob/living/simple_animal/hostile/scarybat(M.current.loc, M.current)
new /mob/living/simple_animal/hostile/scarybat(M.current.loc, M.current)
M.current.remove_vampire_blood(75)
M.current.verbs -= /client/proc/vampire_bats
spawn(1200) M.current.verbs += /client/proc/vampire_bats
M.current.verbs -= /client/vampire/proc/vampire_bats
spawn(1200) M.current.verbs += /client/vampire/proc/vampire_bats
/client/proc/vampire_jaunt()
/client/vampire/proc/vampire_jaunt()
//AHOY COPY PASTE INCOMING
set category = "Vampire"
set name = "Mist Form (30)"
@@ -401,12 +401,12 @@
del(animation)
del(holder)
M.current.remove_vampire_blood(30)
M.current.verbs -= /client/proc/vampire_jaunt
spawn(600) M.current.verbs += /client/proc/vampire_jaunt
M.current.verbs -= /client/vampire/proc/vampire_jaunt
spawn(600) M.current.verbs += /client/vampire/proc/vampire_jaunt
// Blink for vamps
// Less smoke spam.
/client/proc/vampire_shadowstep()
/client/vampire/proc/vampire_shadowstep()
set category = "Vampire"
set name = "Shadowstep (30)"
set desc = "Vanish into the shadows."
@@ -458,9 +458,9 @@
spawn(10)
del(animation)
M.current.remove_vampire_blood(30)
M.current.verbs -= /client/proc/vampire_shadowstep
M.current.verbs -= /client/vampire/proc/vampire_shadowstep
spawn(20)
M.current.verbs += /client/proc/vampire_shadowstep
M.current.verbs += /client/vampire/proc/vampire_shadowstep
/mob/proc/remove_vampire_blood(amount = 0)
var/bloodold
+2 -2
View File
@@ -28,12 +28,12 @@
switch(severity)
if(1.0)
//SN src = null
del(src)
qdel(src)
return
if(2.0)
if (prob(50))
//SN src = null
del(src)
qdel(src)
return
if(3.0)
if (prob(25))
+5 -5
View File
@@ -21,12 +21,12 @@
switch(severity)
if(1.0)
//SN src = null
del(src)
qdel(src)
return
if(2.0)
if (prob(50))
//SN src = null
del(src)
qdel(src)
return
else
return
@@ -250,21 +250,21 @@
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
ex_act(severity)
del(src)
qdel(src)
return
if(2.0)
if(prob(50))
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
ex_act(severity)
del(src)
qdel(src)
return
if(3.0)
if(prob(25))
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
ex_act(severity)
del(src)
qdel(src)
return
return
emp_act(severity)
+5 -5
View File
@@ -102,7 +102,7 @@
ex_act(severity)
//Foreach goto(35)
//SN src = null
del(src)
qdel(src)
return
if(2.0)
if (prob(50))
@@ -111,7 +111,7 @@
ex_act(severity)
//Foreach goto(108)
//SN src = null
del(src)
qdel(src)
return
if(3.0)
if (prob(25))
@@ -120,7 +120,7 @@
ex_act(severity)
//Foreach goto(181)
//SN src = null
del(src)
qdel(src)
return
else
return
@@ -136,12 +136,12 @@
switch(severity)
if(1.0)
//SN src = null
del(src)
qdel(src)
return
if(2.0)
if (prob(50))
//SN src = null
del(src)
qdel(src)
return
else
return
+9 -10
View File
@@ -4,8 +4,8 @@ var/global/list/autolathe_recipes = list( \
new /obj/item/stack/sheet/metal(), \
new /obj/item/stack/sheet/glass(), \
new /obj/item/stack/sheet/rglass(), \
new /obj/item/stack/rods(), \
new /obj/item/stack/sheet/fur(), \
new /obj/item/stack/rods(), \
new /obj/item/weapon/crowbar(), \
new /obj/item/weapon/screwdriver(), \
new /obj/item/weapon/weldingtool(), \
@@ -21,7 +21,6 @@ var/global/list/autolathe_recipes = list( \
new /obj/item/weapon/airlock_electronics(), \
new /obj/item/weapon/airalarm_electronics(), \
new /obj/item/weapon/firealarm_electronics(), \
new /obj/item/weapon/rcd_ammo(), \
new /obj/item/weapon/kitchenknife(), \
new /obj/item/weapon/scalpel(), \
new /obj/item/weapon/circular_saw(), \
@@ -32,9 +31,6 @@ var/global/list/autolathe_recipes = list( \
new /obj/item/weapon/reagent_containers/glass/beaker(), \
new /obj/item/weapon/reagent_containers/glass/beaker/large(), \
new /obj/item/weapon/reagent_containers/glass/bucket(), \
new /obj/item/weapon/storage/box/blanks(), \
new /obj/item/ammo_casing/shotgun/beanbag(), \
new /obj/item/ammo_box/c38(), \
new /obj/item/device/taperecorder(), \
new /obj/item/device/assembly/igniter(), \
new /obj/item/device/assembly/signaler(), \
@@ -46,6 +42,12 @@ var/global/list/autolathe_recipes = list( \
new /obj/item/weapon/light/tube(), \
new /obj/item/weapon/light/bulb(), \
new /obj/item/weapon/camera_assembly(), \
new /obj/item/weapon/rcd_ammo(), \
new /obj/item/ammo_casing/shotgun/beanbag(), \
new /obj/item/weapon/storage/box/blanks(), \
new /obj/item/ammo_casing/shotgun(), \
new /obj/item/ammo_box/c38(), \
new /obj/item/ammo_box/a357(), \
new /obj/item/clothing/ears/earmuffs/tribblemuffs(), \
new /obj/item/clothing/gloves/furgloves(), \
new /obj/item/clothing/head/furcap(), \
@@ -60,12 +62,9 @@ var/global/list/autolathe_recipes_hidden = list( \
new /obj/item/device/radio/electropack(), \
new /obj/item/weapon/weldingtool/largetank(), \
new /obj/item/weapon/handcuffs(), \
new /obj/item/ammo_box/a357(), \
new /obj/item/ammo_casing/shotgun(), \
new /obj/item/ammo_casing/shotgun/dart(), \
/* new /obj/item/weapon/shield/riot(), */ \
/*new /obj/item/ammo_casing/shotgun/dart(), \
new /obj/item/weapon/shield/riot(), */ \
)
/obj/machinery/autolathe
name = "autolathe"
desc = "It produces items using metal and glass."
+1 -1
View File
@@ -27,7 +27,7 @@
SetLuminosity(0)
/obj/machinery/bot/proc/explode()
del(src)
qdel(src)
/obj/machinery/bot/proc/healthcheck()
if (src.health <= 0)
+3 -3
View File
@@ -387,21 +387,21 @@
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
ex_act(severity)
del(src)
qdel(src)
return
if(2.0)
if (prob(50))
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
ex_act(severity)
del(src)
qdel(src)
return
if(3.0)
if (prob(25))
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
ex_act(severity)
del(src)
qdel(src)
return
else
return
@@ -288,7 +288,7 @@
var/area/targetsource = locate(/area/holodeck/source_emptycourt)
holographic_items = targetsource.copy_contents_to(linkedholodeck)
spawn(30)
/* spawn(30)
for(var/obj/effect/landmark/L in linkedholodeck)
if(L.name=="Atmospheric Test Start")
spawn(20)
@@ -298,7 +298,7 @@
s.start()
if(T)
T.temperature = 5000
T.hotspot_expose(50000,50000,1)
T.hotspot_expose(50000,50000,1)*/
active = 1
else
+2 -2
View File
@@ -44,11 +44,11 @@
/obj/machinery/computer/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
return
if(2.0)
if (prob(25))
del(src)
qdel(src)
return
if (prob(50))
for(var/x in verbs)
@@ -29,7 +29,8 @@ var/specops_shuttle_timeleft = 0
var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values.
var/message = "\"THE SPECIAL OPERATIONS SHUTTLE IS PREPARING TO RETURN\""//Initial message shown.
if(announcer)
announcer.autosay(message, "A.L.I.C.E.", "Response Team")
announcer.autosay(message, "A.L.I.C.E.", 144.3)
announcer.autosay(message, "A.L.I.C.E.", 144.1)
while(specops_shuttle_time - world.timeofday > 0)
var/ticksleft = specops_shuttle_time - world.timeofday
@@ -45,7 +46,7 @@ var/specops_shuttle_timeleft = 0
message = "\"ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN\""
if(rounded_time_left==0)
message = "\"ALERT: TAKEOFF\""
announcer.autosay(message, "A.L.I.C.E.", "Response Team")
announcer.autosay(message, "A.L.I.C.E.", )
message_tracker -= rounded_time_left//Remove the number from the list so it won't be called again next cycle.
//Should call all the numbers but lag could mean some issues. Oh well. Not much I can do about that.
@@ -104,9 +105,10 @@ var/specops_shuttle_timeleft = 0
var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values.
var/message = "\"THE SPECIAL OPERATIONS SHUTTLE IS PREPARING FOR LAUNCH\""//Initial message shown.
if(announcer)
announcer.autosay(message, "A.L.I.C.E.", "Response Team")
// message = "ARMORED SQUAD TAKE YOUR POSITION ON GRAVITY LAUNCH PAD"
// announcer.autosay(message, "A.L.I.C.E.", "Response Team")
announcer.autosay(message, "A.L.I.C.E.", 144.3)
announcer.autosay(message, "A.L.I.C.E.", 144.1)
message = "ARMORED SQUAD TAKE YOUR POSITION ON GRAVITY LAUNCH PAD"
announcer.autosay(message, "A.L.I.C.E.", 144.1)
while(specops_shuttle_time - world.timeofday > 0)
var/ticksleft = specops_shuttle_time - world.timeofday
@@ -122,7 +124,8 @@ var/specops_shuttle_timeleft = 0
message = "\"ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN\""
if(rounded_time_left==0)
message = "\"ALERT: TAKEOFF\""
announcer.autosay(message, "A.L.I.C.E.", "Response Team")
announcer.autosay(message, "A.L.I.C.E.", 144.3)
announcer.autosay(message, "A.L.I.C.E.", 144.1)
message_tracker -= rounded_time_left//Remove the number from the list so it won't be called again next cycle.
//Should call all the numbers but lag could mean some issues. Oh well. Not much I can do about that.
@@ -160,11 +163,11 @@ var/specops_shuttle_timeleft = 0
var/spawn_marauder[] = new()
for(var/obj/effect/landmark/L in world)
if(L.name == "Marauder Entry")
spawn_marauder.Add(L)
spawn_marauder.Add(L.loc)
for(var/obj/effect/landmark/L in world)
if(L.name == "Marauder Exit")
var/obj/effect/portal/P = new(L.loc)
P.invisibility = 101//So it is not seen by anyone.
//P.invisibility = 101//So it is not seen by anyone.
P.failchance = 0//So it has no fail chance when teleporting.
P.target = pick(spawn_marauder)//Where the marauder will arrive.
spawn_marauder.Remove(P.target)
@@ -130,17 +130,15 @@ var/syndicate_elite_shuttle_timeleft = 0
*/
elite_squad.readyreset()//Reset firealarm after the team launched.
//End Marauder launchpad.
/*
var/obj/explosionmarker = locate("Syndicate Breach Area")
if(explosionmarker)
var/turf/simulated/T = explosionmarker.loc
if(T)
explosion(T,4,6,8,10,0)
for (var/obj/effect/landmark/L in landmarks_list)
if (L.name == "Syndicate Breach Area")
explosion(L.loc,4,6,8,10,0)
sleep(40)
// proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1)
*/
var/area/start_location = locate(/area/shuttle/syndicate_elite/mothership)
var/area/end_location = locate(/area/shuttle/syndicate_elite/station)
@@ -46,17 +46,6 @@
user << "\blue You add cables to the frame."
state = 2
icon_state = "box_1"
if(istype(P, /obj/item/stack/sheet/glass))
var/obj/item/stack/sheet/glass/G=P
if(G.amount<1)
user << "\red How...?"
return
G.use(1)
user << "\blue You add the glass to the frame."
playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
new /obj/structure/displaycase_frame(src.loc)
del(src)
return
else
if(istype(P, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+3 -3
View File
@@ -333,9 +333,9 @@ obj/machinery/computer/cryopod/Topic(href, href_list)
return
if(orient_right)
icon_state = "body_scanner0-r"
icon_state = "body_scanner_0-r"
else
icon_state = "body_scanner0"
icon_state = "body_scanner_0"
src.go_out()
add_fingerprint(usr)
@@ -411,4 +411,4 @@ obj/machinery/computer/cryopod/Topic(href, href_list)
//Attacks/effects.
/obj/machinery/cryopod/blob_act()
return //Sorta gamey, but we don't really want these to be destroyed.
return //Sorta gamey, but we don't really want these to be destroyed.
+3 -3
View File
@@ -96,7 +96,7 @@ for reference:
switch(severity)
if(1.0)
visible_message("\red <B>The barricade is blown apart!</B>")
del(src)
qdel(src)
return
if(2.0)
src.health -= 25
@@ -105,7 +105,7 @@ for reference:
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
del(src)
qdel(src)
return
meteorhit()
@@ -269,4 +269,4 @@ for reference:
explosion(src.loc,-1,-1,0)
if(src)
del(src)
qdel(src)
+2 -2
View File
@@ -172,10 +172,10 @@
/obj/machinery/door/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
if(2.0)
if(prob(25))
del(src)
qdel(src)
if(3.0)
if(prob(80))
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+3 -3
View File
@@ -160,13 +160,13 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
/obj/machinery/hologram/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
if(2.0)
if (prob(50))
del(src)
qdel(src)
if(3.0)
if (prob(5))
del(src)
qdel(src)
return
/obj/machinery/hologram/blob_act()
+9 -2
View File
@@ -53,6 +53,13 @@
input = /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans
output = /obj/item/weapon/reagent_containers/food/snacks/soydope
wheat
input = /obj/item/weapon/reagent_containers/food/snacks/grown/wheat
output = /obj/item/weapon/reagent_containers/food/snacks/flour
spaghetti
input = /obj/item/weapon/reagent_containers/food/snacks/flour
output = /obj/item/weapon/reagent_containers/food/snacks/spagetti
/* mobs */
mob
@@ -143,13 +150,13 @@
src.processing = 1
user.visible_message("\blue [user] turns on \a [src].", \
"You turn on \a [src].", \
"You hear a food processor")
"You hear a food processor.")
playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
use_power(500)
sleep(P.time)
P.process(src.loc, O)
src.processing = 0
src.visible_message("\blue \the [src] finished processing.", \
"You hear food processor stops")
"You hear the food processor stopping/")
+7 -3
View File
@@ -140,15 +140,15 @@ Class Procs:
/obj/machinery/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
return
if(2.0)
if (prob(50))
del(src)
qdel(src)
return
if(3.0)
if (prob(25))
del(src)
qdel(src)
return
else
return
@@ -232,6 +232,10 @@ Class Procs:
src.add_fingerprint(user)
return 0
/obj/machinery/CheckParts()
RefreshParts()
return
/obj/machinery/proc/RefreshParts() //Placeholder proc for machines that are built using frames.
return
return 0
+2 -2
View File
@@ -152,12 +152,12 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
/obj/machinery/newscaster/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
return
if(2.0)
src.isbroken=1
if(prob(50))
del(src)
qdel(src)
else
src.update_icon() //can't place it above the return and outside the if-else. or we might get runtimes of null.update_icon() if(prob(50)) goes in.
return
+2 -2
View File
@@ -406,7 +406,7 @@ Status: []<BR>"},
/obj/machinery/porta_turret/ex_act(severity)
if(severity >= 3) // turret dies if an explosion touches it!
del(src)
qdel(src)
else
src.die()
@@ -418,7 +418,7 @@ Status: []<BR>"},
invisibility=0
src.spark_system.start() // creates some sparks because they look cool
src.density=1
del(cover) // deletes the cover - no need on keeping it there!
qdel(cover) // deletes the cover - no need on keeping it there!
+4 -4
View File
@@ -92,13 +92,13 @@
switch(severity)
if(1.0)
if (prob(75))
del(src)
qdel(src)
if(2.0)
if (prob(50))
del(src)
qdel(src)
if(3.0)
if (prob(25))
del(src)
qdel(src)
return
/obj/machinery/shield/emp_act(severity)
@@ -164,7 +164,7 @@
/obj/machinery/shieldgen/Del()
for(var/obj/machinery/shield/shield_tile in deployed_shields)
del(shield_tile)
qdel(shield_tile)
..()
+2 -2
View File
@@ -78,12 +78,12 @@
if(1.0)
if(prob(50))
src.dump_everything() //So suits dont survive all the time
del(src)
qdel(src)
return
if(2.0)
if(prob(50))
src.dump_everything()
del(src)
qdel(src)
return
else
return
+1 -1
View File
@@ -301,7 +301,7 @@
sleep(3)
flick("explosion", src)
spawn(13)
del(src)
qdel(src)
/obj/machinery/turretid
name = "turret deactivation control"
+2 -2
View File
@@ -78,11 +78,11 @@
/obj/machinery/vending/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
return
if(2.0)
if (prob(50))
del(src)
qdel(src)
return
if(3.0)
if(prob(25))
+1 -1
View File
@@ -23,7 +23,7 @@
/obj/effect/decal/mecha_wreckage/ex_act(severity)
if(severity < 2)
spawn
del src
qdel(src)
return
/obj/effect/decal/mecha_wreckage/bullet_act(var/obj/item/projectile/Proj)
+4 -4
View File
@@ -58,7 +58,7 @@
/obj/effect/alien/resin/proc/healthcheck()
if(health <=0)
density = 0
del(src)
qdel(src)
return
/obj/effect/alien/resin/bullet_act(var/obj/item/projectile/Proj)
@@ -255,13 +255,13 @@ Alien plants should do something if theres a lot of poison
/obj/effect/alien/weeds/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
if(2.0)
if (prob(50))
del(src)
qdel(src)
if(3.0)
if (prob(5))
del(src)
qdel(src)
return
/obj/effect/alien/weeds/attackby(var/obj/item/weapon/W, var/mob/user)
+2 -2
View File
@@ -523,7 +523,7 @@ steam.start() -- spawns the effect
number = n
cardinals = c
chemholder.reagents.add_reagent("mercury", 50)
chemholder.reagents.add_reagent("space_drugs", rand(1,10))
if(istype(loca, /turf/))
location = loca
@@ -1005,7 +1005,7 @@ steam.start() -- spawns the effect
ex_act(severity)
del(src)
qdel(src)
blob_act()
del(src)
+3 -3
View File
@@ -143,15 +143,15 @@
/obj/effect/glowshroom/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
return
if(2.0)
if (prob(50))
del(src)
qdel(src)
return
if(3.0)
if (prob(5))
del(src)
qdel(src)
return
else
return
+3 -3
View File
@@ -11,13 +11,13 @@
/obj/effect/spider/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
if(2.0)
if (prob(50))
del(src)
qdel(src)
if(3.0)
if (prob(5))
del(src)
qdel(src)
return
/obj/effect/spider/attackby(var/obj/item/weapon/W, var/mob/user)
+3 -3
View File
@@ -46,15 +46,15 @@
/obj/item/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
return
if(2.0)
if (prob(50))
del(src)
qdel(src)
return
if(3.0)
if (prob(5))
del(src)
qdel(src)
return
else
return
+7 -7
View File
@@ -136,13 +136,13 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/syndicate
default_cartridge = /obj/item/weapon/cartridge/syndicate
icon_state = "pda-syn"
icon_state = "pda-syndi"
name = "Military PDA"
owner = "John Doe"
hidden = 1
/obj/item/device/pda/chaplain
icon_state = "pda-holy"
icon_state = "pda-chaplain"
ttone = "holy"
/obj/item/device/pda/lawyer
@@ -158,7 +158,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
icon_state = "pda-robot"
/obj/item/device/pda/librarian
icon_state = "pda-libb"
icon_state = "pda-library"
desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a WGW-11 series e-reader."
note = "Congratulations, your station has chosen the Thinktronic 5290 WGW-11 Series E-reader and Personal Data Assistant!"
silent = 1 //Quiet in the library!
@@ -172,19 +172,19 @@ var/global/list/obj/item/device/pda/PDAs = list()
icon_state = "pda-chef"
/obj/item/device/pda/bar
icon_state = "pda-bar"
icon_state = "pda-bartender"
/obj/item/device/pda/atmos
default_cartridge = /obj/item/weapon/cartridge/atmos
icon_state = "pda-atmo"
icon_state = "pda-atmos"
/obj/item/device/pda/chemist
default_cartridge = /obj/item/weapon/cartridge/chemistry
icon_state = "pda-chem"
icon_state = "pda-chemistry"
/obj/item/device/pda/geneticist
default_cartridge = /obj/item/weapon/cartridge/medical
icon_state = "pda-gene"
icon_state = "pda-genetics"
// Special AI/pAI PDAs that cannot explode.
+2 -2
View File
@@ -19,8 +19,8 @@
if(!ishuman(user))
user << "\red You don't know how to use this!"
return
if(user.mind.assigned_role == "Mime")
user << "\red Being a mime, you really shouldn't use this."
if(user:miming || user.silent)
user << "\red You find yourself unable to speak at all."
return
if(spamcheck)
user << "\red \The [src] needs to recharge!"
@@ -245,7 +245,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
//#### Grab the connection datum ####//
var/datum/radio_frequency/connection = null
testing("[src]: talk_into([M], [message], [channel])")
//testing("[src]: talk_into([M], [message], [channel])")
if(channel == "headset")
channel = null
if(channel) // If a channel is specified, look for it.
+2 -2
View File
@@ -30,10 +30,10 @@
burst()
switch(severity)
if (1)
del(src)
qdel(src)
if (2)
if (prob(50))
del(src)
qdel(src)
/obj/item/latexballon/bullet_act()
burst()
-426
View File
@@ -1,426 +0,0 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
/*
CONTAINS:
RPD
*/
#define PIPE_BINARY 0
#define PIPE_BENT 1
#define PIPE_TRINARY 2
#define PIPE_UNARY 3
/datum/pipe_info
var/id=-1
var/dir=SOUTH
var/dirtype=PIPE_BINARY
var/icon = 'icons/obj/pipe-item.dmi'
var/icon_state=""
var/selected=0
/datum/pipe_info/New(var/pid,var/direction,var/dt)
src.id=pid
src.icon_state=pipeID2State[pid+1]
src.dir=direction
src.dirtype=dt
/datum/pipe_info/proc/Render(var/dispenser,var/label)
return "<li><a href='?src=\ref[dispenser];makepipe=[id];dir=[dir];type=[dirtype]'>[label]</a></li>"
/datum/pipe_info/meter
icon = 'icons/obj/meter.dmi'
icon_state = "meterX"
/datum/pipe_info/meter/New()
return
/datum/pipe_info/meter/Render(var/dispenser,var/label)
return "<li><a href='?src=\ref[dispenser];makemeter=1;type=3'>[label]</a></li>"
var/global/list/disposalpipeID2State=list(
"pipe-s",
"pipe-c",
"pipe-j1",
"pipe-j2",
"pipe-y",
"pipe-t",
"condisposal",
"outlet",
"intake",
"pipe-j1s",
"pipe-j2s"
)
/datum/pipe_info/disposal
icon = 'icons/obj/pipes/disposal.dmi'
icon_state = "meterX"
/datum/pipe_info/disposal/New(var/pid,var/dt)
src.id=pid
src.icon_state=disposalpipeID2State[pid+1]
src.dir=2
src.dirtype=dt
if(pid<6 || pid>8)
icon_state = "con[icon_state]"
/datum/pipe_info/disposal/Render(var/dispenser,var/label)
return "<li><a href='?src=\ref[dispenser];dmake=[id];type=3'>[label]</a></li>"
var/global/list/RPD_recipes=list(
"Regular Pipes" = list(
"Pipe" = new /datum/pipe_info(0, 1, PIPE_BINARY),
"Bent Pipe" = new /datum/pipe_info(1, 5, PIPE_BENT),
"Manifold" = new /datum/pipe_info(5, 1, PIPE_TRINARY),
"Manual Valve" = new /datum/pipe_info(8, 1, PIPE_BINARY),
"Digital Valve" = new /datum/pipe_info(18, 1, PIPE_BINARY),
"Pipe Cap" = new /datum/pipe_info(21, 1, PIPE_UNARY),
"4-Way Manifold" = new /datum/pipe_info(20,-1, PIPE_BINARY),
"Manual T-Valve" = new /datum/pipe_info(19, 2, PIPE_TRINARY),
),
"Devices"=list(
"Connector" = new /datum/pipe_info(4, 1, PIPE_UNARY),
"Unary Vent" = new /datum/pipe_info(7, 1, PIPE_UNARY),
"Gas Pump" = new /datum/pipe_info(9, 1, PIPE_UNARY),
"Passive Gate" = new /datum/pipe_info(15,1, PIPE_UNARY),
"Volume Pump" = new /datum/pipe_info(16,1, PIPE_UNARY),
"Scrubber" = new /datum/pipe_info(10,1, PIPE_UNARY),
"Meter" = new /datum/pipe_info/meter(),
"Gas Filter" = new /datum/pipe_info(13,1, PIPE_TRINARY),
"Gas Mixer" = new /datum/pipe_info(14,1, PIPE_TRINARY),
),
"Heat Exchange" = list(
"Pipe" = new /datum/pipe_info(2,1, PIPE_BINARY),
"Bent Pipe" = new /datum/pipe_info(3,5, PIPE_BENT),
"Junction" = new /datum/pipe_info(6,1, PIPE_BINARY),
"Heat Exchanger" = new /datum/pipe_info(17,1, PIPE_UNARY),
),
"Insulated Pipes" = list(
"Pipe" = new /datum/pipe_info(11,1, PIPE_BINARY),
"Bent Pipe" = new /datum/pipe_info(12,5, PIPE_BENT),
),
"Disposal Pipes" = list(
"Pipe" = new /datum/pipe_info/disposal(0, PIPE_BINARY),
"Bent Pipe" = new /datum/pipe_info/disposal(1, PIPE_BENT),
"Junction" = new /datum/pipe_info/disposal(2, PIPE_TRINARY),
"Y-Junction" = new /datum/pipe_info/disposal(3, PIPE_TRINARY),
"Trunk" = new /datum/pipe_info/disposal(4, PIPE_TRINARY),
"Bin" = new /datum/pipe_info/disposal(5, PIPE_UNARY),
"Outlet" = new /datum/pipe_info/disposal(6, PIPE_UNARY),
"Chute" = new /datum/pipe_info/disposal(7, PIPE_UNARY),
)
)
/obj/item/weapon/pipe_dispenser
name = "Rapid Piping Device (RPD)"
desc = "A device used to rapidly pipe things."
icon = 'icons/obj/items.dmi'
icon_state = "rpd"
opacity = 0
density = 0
anchored = 0.0
flags = FPRINT | TABLEPASS| CONDUCT
force = 10.0
throwforce = 10.0
throw_speed = 1
throw_range = 5
w_class = 3.0
m_amt = 50000
origin_tech = "engineering=4;materials=2"
var/datum/effect/effect/system/spark_spread/spark_system
var/working = 0
var/p_type = 0
var/p_conntype = 0
var/p_dir = 1
var/p_class = 0
var/p_disposal = 0
/obj/item/weapon/pipe_dispenser/New()
src.spark_system = new /datum/effect/effect/system/spark_spread
spark_system.set_up(5, 0, src)
spark_system.attach(src)
/obj/item/weapon/pipe_dispenser/attack_self(mob/user as mob)
show_menu(user)
/obj/item/weapon/pipe_dispenser/proc/render_dir_img(var/_dir,var/pic,var/title)
var/selected=""
if(_dir==p_dir)
selected=" class=\"selected\""
return "<a href=\"?src=\ref[src];setdir=[_dir]\" title=\"[title]\"[selected]><img src=\"[pic]\" /></a>"
/obj/item/weapon/pipe_dispenser/proc/show_menu(mob/user as mob)
if(!user || !src) return 0
var/dat = {"<h2>Type</h2>
<b>Utilities:</b>
<ul>
<li><a href='?src=\ref[src];eatpipes=1;type=-1'>Eat Pipes</a></li>
<!--<li><a href='?src=\ref[src];paintpipes=1;type=-1'>Paint Pipes</a></li>-->
</ul>"}
var/icon/preview=null
for(var/category in RPD_recipes)
dat += "<b>[category]:</b><ul>"
var/list/cat=RPD_recipes[category]
for(var/label in cat)
var/datum/pipe_info/I = cat[label]
var/found=0
if(I.id == p_type)
if(p_class==0 && I.type==/datum/pipe_info)
found=1
else if(p_class==2 && I.type==/datum/pipe_info/disposal)
found=1
if(found)
preview=new /icon(I.icon,I.icon_state)
dat += I.Render(src,label)
dat += "</ul>"
var/dirsel="<h2>Direction</h2>"
switch(p_conntype)
if(PIPE_BINARY) // Straight, N-S, W-E
if(preview)
user << browse_rsc(new /icon(preview, dir=NORTH), "vertical.png")
user << browse_rsc(new /icon(preview, dir=EAST), "horizontal.png")
dirsel += "<p>"
dirsel += render_dir_img(1,"vertical.png","Vertical")
dirsel += render_dir_img(4,"horizontal.png","Horizontal")
dirsel += "</p>"
else
dirsel+={"
<p>
<a href="?src=\ref[src];setdir=1" title="vertical">&#8597;</a>
<a href="?src=\ref[src];setdir=4" title="horizontal">&harr;</a>
</p>
"}
if(PIPE_BENT) // Bent, N-W, N-E etc
if(preview)
user << browse_rsc(new /icon(preview, dir=NORTHWEST), "nw.png")
user << browse_rsc(new /icon(preview, dir=NORTHEAST), "ne.png")
user << browse_rsc(new /icon(preview, dir=SOUTHWEST), "sw.png")
user << browse_rsc(new /icon(preview, dir=SOUTHEAST), "se.png")
dirsel += "<p>"
dirsel += render_dir_img(9,"nw.png","West to North")
dirsel += render_dir_img(5,"ne.png","North to East")
dirsel += "<br />"
dirsel += render_dir_img(10,"sw.png","South to West")
dirsel += render_dir_img(6,"se.png","East to South")
dirsel += "</p>"
else
dirsel+={"
<p>
<a href="?src=\ref[src];setdir=9" title="West to North">&#9565;</a>
<a href="?src=\ref[src];setdir=5" title="North to East">&#9562;</a>
<br />
<a href="?src=\ref[src];setdir=10" title="South to West">&#9559;</a>
<a href="?src=\ref[src];setdir=6" title="East to South">&#9556;</a>
</p>
"}
if(PIPE_TRINARY) // Manifold
if(preview)
user << browse_rsc(new /icon(preview, dir=NORTH), "s.png")
user << browse_rsc(new /icon(preview, dir=EAST), "w.png")
user << browse_rsc(new /icon(preview, dir=SOUTH), "n.png")
user << browse_rsc(new /icon(preview, dir=WEST), "e.png")
dirsel += "<p>"
dirsel += render_dir_img(1,"s.png","West South East")
dirsel += render_dir_img(4,"w.png","North West South")
dirsel += "<br />"
dirsel += render_dir_img(2,"n.png","East North West")
dirsel += render_dir_img(8,"e.png","South East North")
dirsel += "</p>"
else
dirsel+={"
<p>
<a href="?src=\ref[src];setdir=1" title="West, South, East">&#9574;</a>
<a href="?src=\ref[src];setdir=4" title="North, West, South">&#9571;</a>
<br />
<a href="?src=\ref[src];setdir=2" title="East, North, West">&#9577;</a>
<a href="?src=\ref[src];setdir=8" title="South, East, North">&#9568;</a>
</p>
"}
if(PIPE_UNARY) // Unary
if(preview)
user << browse_rsc(new /icon(preview, dir=NORTH), "n.png")
user << browse_rsc(new /icon(preview, dir=EAST), "e.png")
user << browse_rsc(new /icon(preview, dir=SOUTH), "s.png")
user << browse_rsc(new /icon(preview, dir=WEST), "w.png")
dirsel += "<p>"
dirsel += render_dir_img(NORTH,"n.png","North")
dirsel += render_dir_img(EAST, "e.png","East")
dirsel += render_dir_img(SOUTH,"s.png","South")
dirsel += render_dir_img(WEST, "w.png","West")
dirsel += "</p>"
else
dirsel+={"
<p>
<a href="?src=\ref[src];setdir=[NORTH]" title="North">&uarr;</a>
<a href="?src=\ref[src];setdir=[EAST]" title="East">&rarr;</a>
<a href="?src=\ref[src];setdir=[SOUTH]" title="South">&darr;</a>
<a href="?src=\ref[src];setdir=[WEST]" title="West">&larr;</a>
</p>
"}
dat = {"
<html>
<head>
<title>[name]</title>
<style type="text/css">
html {
font-family:sans-serif;
font-size:small;
}
a{
color:#0066cc;
text-decoration:none;
}
a img {
border:1px solid #0066cc;
}
a.selected img,
a:hover {
background: #0066cc;
color: #ffffff;
}
</style>
</head>
<body>
[dirsel][dat]
</body>
</html>
"}
user << browse(dat, "window=pipedispenser")
onclose(user, "pipedispenser")
return
/obj/item/weapon/pipe_dispenser/Topic(href, href_list)
if(usr.stat || usr.restrained())
usr << browse(null, "window=pipedispenser")
return
usr.set_machine(src)
src.add_fingerprint(usr)
if(href_list["setdir"])
p_dir= text2num(href_list["setdir"])
show_menu(usr)
if(href_list["eatpipes"])
p_class = -1
p_conntype=-1
p_dir=1
src.spark_system.start()
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
show_menu(usr)
if(href_list["makepipe"])
p_type = text2num(href_list["makepipe"])
p_dir = text2num(href_list["dir"])
p_conntype = text2num(href_list["type"])
p_class = 0
src.spark_system.start()
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
show_menu(usr)
if(href_list["makemeter"])
p_class = 1
p_conntype=-1
p_dir=1
src.spark_system.start()
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
show_menu(usr)
if(href_list["dmake"])
p_type = text2num(href_list["dmake"])
p_conntype = text2num(href_list["type"])
p_dir = 1
p_class = 2
src.spark_system.start()
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
show_menu(usr)
/obj/item/weapon/pipe_dispenser/afterattack(atom/A, mob/user)
if(!isrobot(user) && !ishuman(user))
return 0
if(istype(A,/area/shuttle)||istype(A,/turf/space/transit))
return 0
switch(p_class)
if(-1) // Eating pipes
// Must click on an actual pipe or meter.
if(istype(A,/obj/item/pipe) || istype(A,/obj/item/pipe_meter) || istype(A,/obj/structure/disposalconstruct))
user << "Destroying Pipe..."
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 5))
activate()
del(A)
return 1
return 0
// Avoid spewing errors about invalid mode -1 when clicking on stuff that aren't pipes.
user << "The [src]'s error light flickers. Perhaps you need to only use it on pipes and pipe meters?"
return 0
if(0)
if(!(istype(A, /turf)))
return 0
user << "Building Pipes ..."
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 20))
activate()
var/obj/item/pipe/P = new (A, pipe_type=p_type, dir=p_dir)
P.update()
P.add_fingerprint(usr)
return 1
return 0
if(1)
if(!(istype(A, /turf)))
return 0
user << "Building Meter..."
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 20))
activate()
new /obj/item/pipe_meter(A)
return 1
return 0
if(2)
if(!(istype(A, /turf)))
return 0
user << "Building Pipes..."
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 20))
activate()
var/obj/structure/disposalconstruct/C = new (A)
// This may still produce runtimes, but I checked and /obj/structure/disposalconstruct
// DOES have a dir property, inherited from /obj/structure. - N3X
C.dir=p_dir
switch(p_type)
if(0)
C.ptype = 0
if(1)
C.ptype = 1
if(2)
C.ptype = 2
if(3)
C.ptype = 4
if(4)
C.ptype = 5
if(5)
C.ptype = 6
C.density = 1
if(6)
C.ptype = 7
C.density = 1
if(7)
C.ptype = 8
C.density = 1
C.add_fingerprint(usr)
C.update()
return 1
return 0
else
..()
return 0
/obj/item/weapon/pipe_dispenser/proc/activate()
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+10 -1
View File
@@ -26,12 +26,21 @@
if(user.mind)
if(user.mind.special_role)
var/role = lowertext(user.mind.special_role)
if(role == "traitor" || role == "syndicate")
if(role == "traitor" || role == "syndicate" || role == "syndicate commando")
message_say = "FOR THE SYNDICATE!"
else if(role == "changeling")
message_say = "FOR THE HIVE!"
else if(role == "cultist")
message_say = "FOR NARSIE!"
else if(role == "ninja")
message_say = "FOR THE CLAN!"
else if(role == "wizard")
message_say = "FOR THE FEDERATION!"
else if(role =="revolutionary" || role == "head revolutionary")
message_say = "FOR THE REVOLOUTION!"
else if(role == "death commando" || role == "emergency response team")
message_say = "FOR NANOTRASEN!"
user.say(message_say)
target = user
explode(get_turf(user))
@@ -1,3 +1,4 @@
/obj/item/weapon/extinguisher
name = "fire extinguisher"
desc = "A traditional red fire extinguisher."
@@ -13,18 +14,18 @@
force = 10
m_amt = 90
attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed")
var/list/reagents_to_log=list(
"fuel"= "welder fuel",
"plasma"= "plasma",
"pacid"= "polytrinic acid",
"sacid"= "sulphuric acid"
)
var/max_water = 50
var/last_use = 1.0
var/safety = 1
var/sprite_name = "fire_extinguisher"
reagents_to_log=list(
"fuel" = "welder fuel",
"plasma"= "plasma",
"pacid" = "polytrinic acid",
"sacid" = "sulphuric acid"
)
/obj/item/weapon/extinguisher/mini
name = "fire extinguisher"
desc = "A light and compact fibreglass-framed model fire extinguisher."
@@ -127,13 +127,10 @@ Implant Specifics:<BR>"}
/obj/item/weapon/implant/explosive
name = "explosive implant"
desc = "A military grade micro bio-explosive. Highly dangerous."
var/elevel = "Localized Limb"
var/phrase = "supercalifragilisticexpialidocious"
icon_state = "implant_evil"
New()
..()
phrase=GenerateKey()
get_data()
var/dat = {"
<b>Implant Specifications:</b><BR>
@@ -161,20 +158,50 @@ Implant Specifics:<BR>"}
activate()
if (malfunction == MALFUNCTION_PERMANENT)
return
var/need_gib = null
if(istype(imp_in, /mob/))
var/mob/T = imp_in
message_admins("Explosive implant triggered in [T] ([T.key]). (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>) ")
log_game("Explosive implant triggered in [T] ([T.key]).")
need_gib = 1
if(ishuman(imp_in))
if (elevel == "Localized Limb")
if(part) //For some reason, small_boom() didn't work. So have this bit of working copypaste.
imp_in.visible_message("\red Something beeps inside [imp_in][part ? "'s [part.display_name]" : ""]!")
playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3)
sleep(25)
if (istype(part,/datum/organ/external/chest) || \
istype(part,/datum/organ/external/groin) || \
istype(part,/datum/organ/external/head))
part.createwound(BRUISE, 60) //mangle them instead
explosion(get_turf(imp_in), -1, -1, 2, 3)
del(src)
else
explosion(get_turf(imp_in), -1, -1, 2, 3)
part.droplimb(1)
del(src)
if (elevel == "Destroy Body")
explosion(get_turf(T), -1, 0, 1, 6)
T.gib()
if (elevel == "Full Explosion")
explosion(get_turf(T), 0, 1, 3, 6)
T.gib()
else
explosion(get_turf(imp_in), 0, 1, 3, 6)
if(need_gib)
imp_in.gib()
T.gib()
explosion(get_turf(imp_in), 1, 3, 4, 6, 3)
var/turf/t = get_turf(imp_in)
if(t)
t.hotspot_expose(3500,125)
implanted(mob/source as mob)
elevel = alert("What sort of explosion would you prefer?", "Implant Intent", "Localized Limb", "Destroy Body", "Full Explosion")
phrase = input("Choose activation phrase:") as text
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "")
phrase = sanitize_simple(phrase, replacechars)
@@ -219,7 +246,7 @@ Implant Specifics:<BR>"}
part.createwound(BRUISE, 60) //mangle them instead
else
part.droplimb(1)
explosion(get_turf(imp_in), -1, -1, 2, 3, 3)
explosion(get_turf(imp_in), -1, -1, 2, 3)
del(src)
/obj/item/weapon/implant/chem
@@ -528,3 +555,4 @@ the implant may become unstable and either pre-maturely inject the subject or si
/obj/item/weapon/implant/cortical
name = "cortical stack"
desc = "A fist-sized mass of biocircuits and chips."
icon_state = "implant_evil"
+14 -11
View File
@@ -703,7 +703,7 @@
/obj/item/weapon/book/manual/chef_recipes
name = "Chef Recipes"
icon_state = "cooked_book"
author = "Lord Frenrir Cageth"
author = "Victoria Ponsonby"
title = "Chef Recipes"
/*dat = {"<html>
<head>
@@ -720,32 +720,35 @@
<h1>Food for Dummies</h1>
Here is a guide on basic food recipes and also how to not poison your customers accidentally.
<h2>Basics:<h2>
Knead an egg and some flour to make dough. Bake that to make a bun or flatten and cut it.
<h2>Burger:<h2>
Put 1 meat and 1 flour into the microwave and turn it on. Then wait.
Put a bun and some meat into the microwave and turn it on. Then wait.
<h2>Bread:<h2>
Put 3 flour into the microwave and then wait.
Put some dough and an egg into the microwave and then wait.
<h2>Waffles:<h2>
Add 2 flour and 2 egg to the microwave and then wait.
Add two lumps of dough and 10u of sugar to the microwave and then wait.
<h2>Popcorn:<h2>
Add 1 corn to the microwave and wait.
<h2>Meat Steak:<h2>
Put 1 meat, 1 unit of salt and 1 unit of pepper into the microwave and wait.
Put a slice of meat, 1 unit of salt and 1 unit of pepper into the microwave and wait.
<h2>Meat Pie:<h2>
Put 1 meat and 2 flour into the microwave and wait.
Put a flattened piece of dough and some meat into the microwave and wait.
<h2>Boiled Spagetti:<h2>
Put 1 spagetti and 5 units of water into the microwave and wait.
<h2>Boiled Spaghetti:<h2>
Put the spaghetti (processed flour) and 5 units of water into the microwave and wait.
<h2>Donuts:<h2>
Add 1 egg and 1 flour to the microwave and wait.
Add some dough and 5 units of sugar to the microwave and wait.
<h2>Fries:<h2>
Add one potato to the processor and wait.
Add one potato to the processor, then bake them in the microwave.
</body>
@@ -1045,4 +1048,4 @@
</body>
</html>
"}
"}
+5 -2
View File
@@ -26,6 +26,10 @@
update_icon()
return
/obj/item/weapon/melee/baton/CheckParts()
bcell = locate(/obj/item/weapon/cell) in contents
update_icon()
/obj/item/weapon/melee/baton/proc/deductcharge(var/chrgdeductamt)
if(bcell)
if(bcell.rigged)
@@ -220,5 +224,4 @@
else if(!bcell)
icon_state = "stunprod_nocell"
else
icon_state = "stunprod"
icon_state = "stunprod"
+4
View File
@@ -16,6 +16,10 @@
var/damtype = "brute"
var/force = 0
// What reagents should be logged when transferred TO this object?
// Reagent ID => friendly name
var/list/reagents_to_log=list()
/obj/item/proc/is_used_on(obj/O, mob/user)
/obj/proc/process()
+2 -2
View File
@@ -8,11 +8,11 @@ obj/structure/blob_act()
obj/structure/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
return
if(2.0)
if(prob(50))
del(src)
qdel(src)
return
if(3.0)
return
@@ -141,19 +141,19 @@
for(var/atom/movable/A as mob|obj in src)//pulls everything out of the locker and hits it with an explosion
A.loc = src.loc
A.ex_act(severity++)
del(src)
qdel(src)
if(2)
if(prob(50))
for (var/atom/movable/A as mob|obj in src)
A.loc = src.loc
A.ex_act(severity++)
del(src)
qdel(src)
if(3)
if(prob(5))
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
A.ex_act(severity++)
del(src)
qdel(src)
/obj/structure/closet/bullet_act(var/obj/item/projectile/Proj)
health -= Proj.damage
@@ -30,9 +30,11 @@
New()
..()
sleep(2)
for(var/i = 0, i < 3, i++)
new /obj/item/weapon/reagent_containers/food/drinks/flour(src)
for(var/i = 0, i < 6, i++)
new /obj/item/weapon/reagent_containers/food/snacks/flour(src)
new /obj/item/weapon/reagent_containers/food/condiment/sugar(src)
for(var/i = 0, i < 3, i++)
new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src)
return
@@ -75,7 +77,7 @@
sleep(2)
for(var/i = 0, i < 5, i++)
new /obj/item/weapon/reagent_containers/food/drinks/milk(src)
for(var/i = 0, i < 5, i++)
for(var/i = 0, i < 3, i++)
new /obj/item/weapon/reagent_containers/food/drinks/soymilk(src)
for(var/i = 0, i < 2, i++)
new /obj/item/weapon/storage/fancy/egg_box(src)
@@ -99,17 +99,17 @@
if(1.0)
for(var/obj/O in src.contents)
del(O)
del(src)
qdel(src)
return
if(2.0)
for(var/obj/O in src.contents)
if(prob(50))
del(O)
del(src)
qdel(src)
return
if(3.0)
if (prob(50))
del(src)
qdel(src)
return
else
return
@@ -448,4 +448,4 @@
// new /obj/item/weapon/weedspray(src)
// new /obj/item/weapon/pestspray(src)
// new /obj/item/weapon/pestspray(src)
// new /obj/item/weapon/pestspray(src)
// new /obj/item/weapon/pestspray(src)
+6 -89
View File
@@ -1,57 +1,3 @@
/obj/structure/displaycase_frame
name = "display case frame"
icon = 'icons/obj/stock_parts.dmi'
icon_state="box_glass"
var/obj/item/weapon/circuitboard/airlock/circuit=null
var/state=0
/obj/structure/displaycase_frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
var/pstate=state
var/turf/T=get_turf(src)
switch(state)
if(0)
if(istype(W, /obj/item/weapon/circuitboard/airlock))
user.drop_item()
circuit=W
circuit.loc=src
state++
playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
if(istype(W, /obj/item/weapon/crowbar))
new /obj/machinery/constructable_frame(T)
new /obj/item/stack/sheet/glass(T)
del(src)
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
return
if(1)
if(isscrewdriver(W))
var/obj/structure/displaycase/C=new(T)
if(circuit.one_access)
C.req_access = null
C.req_one_access = circuit.conf_access
else
C.req_access = circuit.conf_access
C.req_one_access = null
playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
del(src)
return
if(istype(W, /obj/item/weapon/crowbar))
circuit.loc=T
circuit=null
state--
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
if(pstate!=state)
pstate=state
update_icon()
/obj/structure/displaycase_frame/update_icon()
switch(state)
if(1)
icon_state="box_glass_circuit"
else
icon_state="box_glass"
/obj/structure/displaycase
name = "Display Case"
icon = 'icons/obj/stationobjs.dmi'
@@ -67,8 +13,6 @@
var/ue=null
var/icon/occupant_overlay=null
var/obj/item/weapon/circuitboard/airlock/circuit
/obj/structure/displaycase/captains_laser/New()
occupant=new /obj/item/weapon/gun/energy/laser/captain(src)
locked=1
@@ -84,9 +28,8 @@
usr << "Nothing."
/obj/structure/displaycase/proc/dump()
if(occupant)
occupant.loc=get_turf(src)
occupant=null
occupant.loc=get_turf(src)
occupant=null
occupant_overlay=null
/obj/structure/displaycase/ex_act(severity)
@@ -95,7 +38,7 @@
new /obj/item/weapon/shard( src.loc )
if (occupant)
dump()
del(src)
qdel(src)
if (2)
if (prob(50))
src.health -= 15
@@ -132,7 +75,7 @@
src.density = 0
src.destroyed = 1
new /obj/item/weapon/shard( src.loc )
playsound(get_turf(src), "shatter", 70, 1)
playsound(src, "shatter", 70, 1)
update_icon()
else
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
@@ -167,33 +110,7 @@
user << "\icon[src] \blue You close \the [src] and swipe your card, locking it."
update_icon()
return
if(istype(W,/obj/item/weapon/crowbar) && (!locked || destroyed))
user.visible_message("[user.name] pries \the [src] apart.", \
"You pry \the [src] apart.", \
"You hear something pop.")
var/turf/T=get_turf(src)
playsound(T, 'sound/items/Crowbar.ogg', 50, 1)
dump()
var/obj/item/weapon/circuitboard/airlock/C=circuit
if(!C)
C=new (src)
C.one_access=!(req_access && req_access.len>0)
if(!C.one_access)
C.conf_access=req_access
else
C.conf_access=req_one_access
if(!destroyed)
var/obj/structure/displaycase_frame/F=new(T)
F.state=1
F.circuit=C
F.circuit.loc=F
F.update_icon()
else
C.loc=T
circuit=null
new /obj/machinery/constructable_frame(T)
del(src)
if(user.a_intent == "hurt")
if(user.a_intent == "harm")
src.health -= W.force
src.healthcheck()
..()
@@ -222,7 +139,7 @@
src.add_fingerprint(user)
update_icon()
else
if(user.a_intent == "hurt")
if(user.a_intent == "harm")
user.visible_message("\red [user.name] kicks \the [src]!", \
"\red You kick \the [src]!", \
"You hear glass crack.")
+12 -6
View File
@@ -176,6 +176,12 @@
..()
bullet_act(var/obj/item/projectile/Proj)
if(istype(Proj ,/obj/item/projectile/beam/pulse))
src.ex_act(1)
..()
return 0
blob_act()
if(prob(40))
del(src)
@@ -184,19 +190,19 @@
ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
return
if(2.0)
if (prob(30))
var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
new remains(loc)
del(src)
qdel(src)
return
if(3.0)
if (prob(5))
var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
new remains(loc)
del(src)
qdel(src)
return
else
return
@@ -245,17 +251,17 @@
ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
return
if(2.0)
if (prob(30))
new /obj/effect/decal/remains/human(loc)
del(src)
qdel(src)
return
if(3.0)
if (prob(5))
new /obj/effect/decal/remains/human(loc)
del(src)
qdel(src)
return
else
return
+3 -3
View File
@@ -40,13 +40,13 @@
/obj/structure/grille/ex_act(severity)
del(src)
qdel(src)
/obj/structure/grille/blob_act()
del(src)
qdel(src)
/obj/structure/grille/meteorhit(var/obj/M)
del(src)
qdel(src)
/obj/structure/grille/Bumped(atom/user)
+3 -3
View File
@@ -15,7 +15,7 @@
if (1)
new /obj/item/weapon/shard( src.loc )
Break()
del(src)
qdel(src)
if (2)
if (prob(50))
src.health -= 15
@@ -37,13 +37,13 @@
if (prob(75))
new /obj/item/weapon/shard( src.loc )
Break()
del(src)
qdel(src)
/obj/structure/lamarr/meteorhit(obj/O as obj)
new /obj/item/weapon/shard( src.loc )
Break()
del(src)
qdel(src)
/obj/structure/lamarr/proc/healthcheck()
+2 -2
View File
@@ -39,10 +39,10 @@
/obj/structure/lattice/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
return
if(2.0)
del(src)
qdel(src)
return
if(3.0)
return
@@ -138,7 +138,7 @@
var/ore = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
for(var/i = 3, i <= oreAmount, i++)
new ore(get_turf(src))
del(src)
qdel(src)
ex_act(severity = 1)
switch(severity)
+3 -3
View File
@@ -32,13 +32,13 @@
/obj/structure/mopbucket/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
return
if(2.0)
if (prob(50))
del(src)
qdel(src)
return
if(3.0)
if (prob(5))
del(src)
qdel(src)
return
+6 -6
View File
@@ -48,21 +48,21 @@
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
ex_act(severity)
del(src)
qdel(src)
return
if(2.0)
if (prob(50))
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
ex_act(severity)
del(src)
qdel(src)
return
if(3.0)
if (prob(5))
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
ex_act(severity)
del(src)
qdel(src)
return
return
@@ -213,21 +213,21 @@
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
ex_act(severity)
del(src)
qdel(src)
return
if(2.0)
if (prob(50))
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
ex_act(severity)
del(src)
qdel(src)
return
if(3.0)
if (prob(5))
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
ex_act(severity)
del(src)
qdel(src)
return
return
+5 -5
View File
@@ -8,19 +8,19 @@
/obj/structure/sign/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
return
if(2.0)
del(src)
qdel(src)
return
if(3.0)
del(src)
qdel(src)
return
else
return
/obj/structure/sign/blob_act()
del(src)
qdel(src)
return
/obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) //deconstruction
@@ -228,4 +228,4 @@
/obj/structure/sign/directions/evac
name = "\improper Escape Arm"
desc = "A direction sign, pointing out which way escape shuttle dock is."
icon_state = "direction_evac"
icon_state = "direction_evac"
@@ -10,15 +10,15 @@
/obj/structure/stool/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
return
if(2.0)
if (prob(50))
del(src)
qdel(src)
return
if(3.0)
if (prob(5))
del(src)
qdel(src)
return
return
+208 -46
View File
@@ -13,20 +13,97 @@
/datum/table_recipe
var/name = ""
var/reqs[]
var/reqs[] = list()
var/result_path
var/tools[]
var/tools[] = list()
var/time = 0
var/parts[] = list()
var/chem_catalists[] = list()
/datum/table_recipe/flame_thrower
/datum/table_recipe/IED
name = "IED"
result_path = /obj/item/weapon/grenade/iedcasing
reqs = list("/obj/item/weapon/handcuffs/cable" = 1,
"/obj/item/stack/cable_coil" = 1,
"/obj/item/device/assembly/igniter" = 1,
"/obj/item/weapon/reagent_containers/food/drinks/cans" = 1,
"/datum/reagent/fuel" = 10)
time = 80
/datum/table_recipe/stunprod
name = "Stunprod"
result_path = /obj/item/weapon/melee/baton/cattleprod
reqs = list("/obj/item/weapon/handcuffs/cable" = 1,
"/obj/item/stack/rods" = 1,
"/obj/item/weapon/wirecutters" = 1,
"/obj/item/weapon/cell" = 1)
time = 80
parts = list("/obj/item/weapon/cell" = 1)
/datum/table_recipe/ed209
name = "ED209"
result_path = /obj/machinery/bot/ed209
reqs = list("/obj/item/robot_parts/robot_suit" = 1,
"/obj/item/clothing/head/helmet" = 1,
"/obj/item/clothing/suit/armor/vest" = 1,
"/obj/item/robot_parts/l_leg" = 1,
"/obj/item/robot_parts/r_leg" = 1,
"/obj/item/stack/sheet/metal" = 5,
"/obj/item/stack/cable_coil" = 5,
"/obj/item/weapon/gun/energy/taser" = 1,
"/obj/item/weapon/cell" = 1,
"/obj/item/device/assembly/prox_sensor" = 1,
"/obj/item/robot_parts/r_arm" = 1)
tools = list(/obj/item/weapon/weldingtool, /obj/item/weapon/screwdriver)
time = 120
/datum/table_recipe/secbot
name = "Secbot"
result_path = /obj/machinery/bot/secbot
reqs = list("/obj/item/device/assembly/signaler" = 1,
"/obj/item/clothing/head/helmet" = 1,
"/obj/item/weapon/melee/baton" = 1,
"/obj/item/device/assembly/prox_sensor" = 1,
"/obj/item/robot_parts/r_arm" = 1)
tools = list(/obj/item/weapon/weldingtool)
time = 120
/datum/table_recipe/cleanbot
name = "Cleanbot"
result_path = /obj/machinery/bot/cleanbot
reqs = list("/obj/item/weapon/reagent_containers/glass/bucket" = 1,
"/obj/item/device/assembly/prox_sensor" = 1,
"/obj/item/robot_parts/r_arm" = 1)
time = 80
/datum/table_recipe/floorbot
name = "Floorbot"
result_path = /obj/machinery/bot/floorbot
reqs = list("/obj/item/weapon/storage/toolbox/mechanical" = 1,
"/obj/item/stack/tile/plasteel" = 1,
"/obj/item/device/assembly/prox_sensor" = 1,
"/obj/item/robot_parts/r_arm" = 1)
time = 80
/datum/table_recipe/medbot
name = "Medbot"
result_path = /obj/machinery/bot/medbot
reqs = list("/obj/item/device/healthanalyzer" = 1,
"/obj/item/weapon/storage/firstaid" = 1,
"/obj/item/device/assembly/prox_sensor" = 1,
"/obj/item/robot_parts/r_arm" = 1)
time = 80
/datum/table_recipe/flamethrower
name = "Flamethrower"
result_path = /obj/item/weapon/flamethrower
reqs = list(/obj/item/weapon/weldingtool = 1,
/obj/item/device/assembly/igniter = 1,
/obj/item/stack/rods = 2)
reqs = list("/obj/item/weapon/weldingtool" = 1,
"/obj/item/device/assembly/igniter" = 1,
"/obj/item/stack/rods" = 2)
tools = list(/obj/item/weapon/screwdriver)
time = 20
/obj/structure/table
name = "table"
desc = "A square piece of metal standing on four metal legs. It can not move."
@@ -64,50 +141,79 @@
/obj/structure/table/proc/destroy()
new parts(loc)
density = 0
del(src)
qdel(src)
/obj/structure/table/MouseDrop(atom/over)
if(usr.stat || usr.lying || !Adjacent(usr) || (over != usr))
return
interact(usr)
/obj/structure/table/proc/check_contents(datum/table_recipe/TR)
/obj/structure/table/proc/check_contents(datum/table_recipe/R)
check_table()
var/datum/table_recipe/R = TR
var/I = R.reqs.len
var/i = R.reqs.len
for(var/A in R.reqs)
if(table_contents[A] < R.reqs[A])
break
else
i--
if(i<=0)
return 1
else
return 0
var/AP = text2path(A)
if(!ispath(AP))
for(var/B in table_contents)
if(!ispath(B))
if(table_contents[B] >= R.reqs[A])
i--
break
I--
if(i > I)
return 0
else
continue
for(var/B in table_contents)
var/BP = text2path(B)
if(ispath(BP, AP))
if(table_contents[B] >= R.reqs[A])
i--
break
I--
if(i > I)
return 0
for(var/A in R.chem_catalists)
if(table_contents[A] < R.chem_catalists[A])
return 0
return !i
/obj/structure/table/proc/check_table()
table_contents = list()
for(var/obj/item/I in loc)
if(istype(I, /obj/item/stack))
var/obj/item/stack/S = I
table_contents[I.type] += S.amount
table_contents["[I.type]"] += S.amount //(table_contents[I.type] ? (table_contents[I.type] + S.amount) : S.amount)
else
table_contents[I.type] += 1
if(istype(I, /obj/item/weapon/reagent_containers))
for(var/datum/reagent/R in I.reagents.reagent_list)
table_contents["[R.type]"] += R.volume
table_contents["[I.type]"] += 1 //(table_contents[I.type] ? (table_contents[I.type] + 1) : 1)
/obj/structure/table/proc/check_tools(mob/user, datum/table_recipe/TR)
if(!TR.tools.len)
return 1
var/list/hands_content = list()
if(user.l_hand)
hands_content.Add(user.l_hand.type)
if(user.r_hand)
hands_content.Add(user.r_hand.type)
var/list/possible_tools = list()
for(var/obj/item/I in user.contents)
if(istype(I, /obj/item/weapon/storage))
for(var/obj/item/SI in I.contents)
possible_tools += (SI.type)
else
possible_tools += (I.type)
for(var/obj/item/TI in loc)
possible_tools |= (TI.type)
var/i = TR.tools.len
var/I
for(var/A in TR.tools)
if(hands_content.Find(A))
hands_content.Remove(A)
I = possible_tools.Find(A)
if(I)
possible_tools.Cut(I, I+1)
i--
else
break
if(i>0)
return 0
return 1
return !i
/obj/structure/table/proc/construct_item(mob/user, datum/table_recipe/TR)
check_table()
@@ -115,23 +221,79 @@
if(do_after(user, TR.time))
if(!check_contents(TR) || !check_tools(user, TR))
return 0
del_reqs(TR)
var/obj/item/I = new TR.result_path
var/list/parts = del_reqs(TR)
var/atom/movable/I = new TR.result_path
for(var/A in parts)
if(istype(A, /obj/item))
var/atom/movable/B = A
B.loc = I
else
if(!I.reagents)
I.reagents = new /datum/reagents()
I.reagents.reagent_list.Add(A)
I.CheckParts()
I.loc = loc
return 1
return 0
/obj/structure/table/proc/del_reqs(datum/table_recipe/TR)
var/datum/table_recipe/R = TR
/obj/structure/table/proc/del_reqs(datum/table_recipe/R)
var/list/Deletion = list()
var/AP
var/BP
var/amt
for(var/A in R.reqs)
var/obj/item/I = locate(A) in loc
if(istype(I, /obj/item/stack))
var/obj/item/stack/S = I
S.amount -= R.reqs[A]
amt = R.reqs[A]
AP = text2path(A)
if(ispath(AP, /obj/item/stack))
var/obj/item/stack/S
stack_loop:
for(var/B in table_contents)
BP = text2path(B)
if(ispath(BP, AP))
while(amt > 0)
S = locate(BP) in loc
if(S.amount >= amt)
S.use(amt)
break stack_loop
else
amt -= S.amount
del(S)
else if(ispath(AP, /obj/item))
var/obj/item/I
item_loop:
for(var/B in table_contents)
BP = text2path(B)
if(ispath(BP, AP))
while(amt > 0)
I = locate(BP) in loc
Deletion.Add(I)
amt--
break item_loop
else
for(var/i=R.reqs[A],i>=0,i--)
I = locate(A) in loc
del(I)
var/datum/reagent/RG = new AP
reagent_loop:
for(var/B in table_contents)
BP = text2path(B)
if(ispath(BP, /obj/item/weapon/reagent_containers))
var/obj/item/RC = locate(BP) in loc
if(RC.reagents.has_reagent(RG.id, amt))
RC.reagents.remove_reagent(RG.id, amt)
RG.volume = amt
Deletion.Add(RG)
break reagent_loop
else if(RC.reagents.has_reagent(RG.id))
Deletion.Add(RG)
RG.volume += RC.reagents.get_reagent_amount(RG.id)
amt -= RC.reagents.get_reagent_amount(RG.id)
RC.reagents.del_reagent(RG.id)
for(var/A in R.parts)
AP = text2path(A)
for(var/B in Deletion)
if(!istype(B, AP))
Deletion.Remove(B)
del(B)
return Deletion
/obj/structure/table/interact(mob/user)
check_table()
@@ -362,11 +524,11 @@
/obj/structure/table/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
return
if(2.0)
if (prob(50))
del(src)
qdel(src)
return
if(3.0)
if (prob(25))
@@ -403,7 +565,7 @@
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
destroy()
else
interact(user)
..()
/obj/structure/table/attack_tk() // no telehulk sorry
return
@@ -793,14 +955,14 @@
/obj/structure/rack/ex_act(severity)
switch(severity)
if(1.0)
del(src)
qdel(src)
if(2.0)
del(src)
qdel(src)
if(prob(50))
new /obj/item/weapon/rack_parts(src.loc)
if(3.0)
if(prob(25))
del(src)
qdel(src)
new /obj/item/weapon/rack_parts(src.loc)
/obj/structure/rack/blob_act()

Some files were not shown because too many files have changed in this diff Show More