Fixing merge conflicts
THis is getting harder and harder
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
//node1, air1, network1 correspond to input
|
||||
//node2, air2, network2 correspond to output
|
||||
//node2, air2, network2 correspond to input
|
||||
//node1, air1, network1 correspond to output
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/binary/circulator
|
||||
name = "circulator/heat exchanger"
|
||||
@@ -15,9 +16,12 @@
|
||||
anchored = 1.0
|
||||
density = 1
|
||||
|
||||
|
||||
proc/return_transfer_air()
|
||||
var/output_starting_pressure = air2.return_pressure()
|
||||
var/input_starting_pressure = air1.return_pressure()
|
||||
|
||||
|
||||
var/output_starting_pressure = air1.return_pressure()
|
||||
var/input_starting_pressure = air2.return_pressure()
|
||||
|
||||
if(output_starting_pressure >= input_starting_pressure-10)
|
||||
//Need at least 10 KPa difference to overcome friction in the mechanism
|
||||
@@ -25,17 +29,17 @@
|
||||
return null
|
||||
|
||||
//Calculate necessary moles to transfer using PV = nRT
|
||||
if(air1.temperature>0)
|
||||
if(air2.temperature>0)
|
||||
var/pressure_delta = (input_starting_pressure - output_starting_pressure)/2
|
||||
|
||||
var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
|
||||
var/transfer_moles = pressure_delta*air1.volume/(air2.temperature * R_IDEAL_GAS_EQUATION)
|
||||
|
||||
last_pressure_delta = pressure_delta
|
||||
|
||||
//world << "pressure_delta = [pressure_delta]; transfer_moles = [transfer_moles];"
|
||||
|
||||
//Actually transfer the gas
|
||||
var/datum/gas_mixture/removed = air1.remove(transfer_moles)
|
||||
var/datum/gas_mixture/removed = air2.remove(transfer_moles)
|
||||
|
||||
if(network1)
|
||||
network1.update = 1
|
||||
|
||||
@@ -41,8 +41,8 @@ var/list/sec_departments = list("engineering", "supply", "medical", "science")
|
||||
var/turf/T
|
||||
var/safety = 0
|
||||
while(safety < 25)
|
||||
T = pick(get_area_turfs(destination))
|
||||
if(!H.Move(T))
|
||||
T = safepick(get_area_turfs(destination))
|
||||
if(T && !H.Move(T))
|
||||
safety += 1
|
||||
continue
|
||||
else
|
||||
@@ -112,17 +112,13 @@ var/list/sec_departments = list("engineering", "supply", "medical", "science")
|
||||
keyslot2 = new /obj/item/device/encryptionkey/headset_sci
|
||||
|
||||
/obj/item/clothing/under/rank/security/cargo/New()
|
||||
var/obj/item/clothing/tie/armband/cargo/A = new /obj/item/clothing/tie/armband/cargo
|
||||
hastie = A
|
||||
attachTie(new /obj/item/clothing/tie/armband/cargo)
|
||||
|
||||
/obj/item/clothing/under/rank/security/engine/New()
|
||||
var/obj/item/clothing/tie/armband/engine/A = new /obj/item/clothing/tie/armband/engine
|
||||
hastie = A
|
||||
attachTie(new /obj/item/clothing/tie/armband/engine)
|
||||
|
||||
/obj/item/clothing/under/rank/security/science/New()
|
||||
var/obj/item/clothing/tie/armband/science/A = new /obj/item/clothing/tie/armband/science
|
||||
hastie = A
|
||||
attachTie(new /obj/item/clothing/tie/armband/science)
|
||||
|
||||
/obj/item/clothing/under/rank/security/med/New()
|
||||
var/obj/item/clothing/tie/armband/medgreen/A = new /obj/item/clothing/tie/armband/medgreen
|
||||
hastie = A
|
||||
attachTie(new /obj/item/clothing/tie/armband/medgreen)
|
||||
@@ -23,5 +23,5 @@
|
||||
#define BE_ALIEN 64
|
||||
#define BE_PAI 128
|
||||
#define BE_CULTIST 256
|
||||
#define BE_MONKEY 512
|
||||
#define BE_BLOB 512
|
||||
#define BE_NINJA 1024
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
var/datum/surgery/S = new path()
|
||||
surgeries_list[S.name] = S
|
||||
|
||||
init_subtypes(/datum/table_recipe, table_recipes)
|
||||
|
||||
/* // Uncomment to debug chemical reaction list.
|
||||
/client/verb/debug_chemical_list()
|
||||
|
||||
|
||||
@@ -1113,7 +1113,7 @@ proc/oview_or_orange(distance = world.view , center = usr , type)
|
||||
|
||||
//Quick type checks for some tools
|
||||
var/global/list/common_tools = list(
|
||||
/obj/item/weapon/cable_coil,
|
||||
/obj/item/stack/cable_coil,
|
||||
/obj/item/weapon/wrench,
|
||||
/obj/item/weapon/weldingtool,
|
||||
/obj/item/weapon/screwdriver,
|
||||
|
||||
@@ -39,6 +39,6 @@ var/list/be_special_flags = list(
|
||||
"Alien Lifeform" = BE_ALIEN,
|
||||
"pAI" = BE_PAI,
|
||||
"Cultist" = BE_CULTIST,
|
||||
"Monkey" = BE_MONKEY,
|
||||
"Blob" = BE_BLOB,
|
||||
"Ninja" = BE_NINJA
|
||||
)
|
||||
|
||||
@@ -11,3 +11,4 @@ var/global/list/active_diseases = list()
|
||||
var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions
|
||||
var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
|
||||
var/global/list/surgeries_list = list() //list of all surgeries by name, associated with their path.
|
||||
var/global/list/table_recipes = list() //list of all table craft recipes
|
||||
@@ -79,7 +79,8 @@
|
||||
return
|
||||
|
||||
var/obj/item/W = get_active_hand()
|
||||
|
||||
|
||||
|
||||
if(W == A)
|
||||
next_move = world.time + 6
|
||||
if(W.flags&USEDELAY)
|
||||
@@ -91,10 +92,9 @@
|
||||
update_inv_r_hand(0)
|
||||
|
||||
return
|
||||
|
||||
|
||||
// operate two levels deep here (item in backpack in src; NOT item in box in backpack in src)
|
||||
if(A == loc || (A in loc) || (A in contents) || (A.loc in contents))
|
||||
|
||||
if(!isturf(A) && A == loc || (A in contents) || (A.loc in contents))
|
||||
// faster access to objects already on you
|
||||
if(A in contents)
|
||||
next_move = world.time + 6 // on your person
|
||||
@@ -119,12 +119,12 @@
|
||||
// Allows you to click on a box's contents, if that box is on the ground, but no deeper than that
|
||||
if(isturf(A) || isturf(A.loc) || (A.loc && isturf(A.loc.loc)))
|
||||
next_move = world.time + 10
|
||||
|
||||
if(A.Adjacent(src)) // see adjacent.dm
|
||||
if(W)
|
||||
if(W.flags&USEDELAY)
|
||||
next_move += 5
|
||||
|
||||
if(W.preattack(A,src,1,params)) //Weapon attack override,return 1 to exit
|
||||
return
|
||||
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
|
||||
var/resolved = A.attackby(W,src)
|
||||
if(!resolved && A && W)
|
||||
@@ -134,6 +134,8 @@
|
||||
return
|
||||
else // non-adjacent click
|
||||
if(W)
|
||||
if(W.preattack(A,src,0,params)) //Weapon attack override,return 1 to exit
|
||||
return
|
||||
W.afterattack(A,src,0,params) // 0: not Adjacent
|
||||
else
|
||||
RangedAttack(A, params)
|
||||
@@ -294,7 +296,7 @@
|
||||
|
||||
// Simple helper to face what you clicked on, in case it should be needed in more than one place
|
||||
/mob/proc/face_atom(var/atom/A)
|
||||
if( buckled || !A || !x || !y || !A.x || !A.y ) return
|
||||
if( buckled || stat != CONSCIOUS || !A || !x || !y || !A.x || !A.y ) return
|
||||
var/dx = A.x - x
|
||||
var/dy = A.y - y
|
||||
if(!dx && !dy) // Wall items are graphically shifted but on the floor
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
/atom/proc/attackby(obj/item/W, mob/user)
|
||||
return
|
||||
/atom/movable/attackby(obj/item/W, mob/user)
|
||||
if(!(W.flags&NOBLUDGEON))
|
||||
if(W && !(W.flags&NOBLUDGEON))
|
||||
visible_message("<span class='danger'>[src] has been hit by [user] with [W].</span>")
|
||||
|
||||
/mob/living/attackby(obj/item/I, mob/user)
|
||||
@@ -20,17 +20,27 @@
|
||||
/obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
return
|
||||
|
||||
// Overrides the weapon attack so it can attack any atoms like when we want to have an effect on an object independent of attackby
|
||||
// It is a powerfull proc but it should be used wisely, if there is other alternatives instead use those
|
||||
// If it returns 1 it exits click code. Always . = 1 at start of the function if you delete src.
|
||||
/obj/item/proc/preattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
return
|
||||
|
||||
obj/item/proc/get_clamped_volume()
|
||||
if(src.force && src.w_class)
|
||||
return Clamp((src.force + src.w_class) * 4, 30, 100)// Add the item's force to its weight class and multiply by 4, then clamp the value between 30 and 100
|
||||
else if(!src.force && src.w_class)
|
||||
return Clamp(src.w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100
|
||||
|
||||
/obj/item/proc/attack(mob/living/M as mob, mob/living/user as mob, def_zone)
|
||||
|
||||
if (!istype(M)) // not sure if this is the right thing...
|
||||
return
|
||||
var/messagesource = M
|
||||
|
||||
if (istype(M,/mob/living/carbon/brain))
|
||||
messagesource = M:container
|
||||
if (hitsound)
|
||||
playsound(loc, hitsound, 50, 1, -1)
|
||||
if (hitsound && force > 0) //If an item's hitsound is defined and the item's force is greater than zero...
|
||||
playsound(loc, hitsound, get_clamped_volume(), 1, -1) //...play the item's hitsound at get_clamped_volume() with varying frequency and -1 extra range.
|
||||
else if (force == 0)//Otherwise, if the item's force is zero...
|
||||
playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), 1, -1)//...play tap.ogg at get_clamped_volume()
|
||||
/////////////////////////
|
||||
user.lastattacked = M
|
||||
M.lastattacker = user
|
||||
@@ -119,15 +129,19 @@
|
||||
|
||||
var/showname = "."
|
||||
if(user)
|
||||
showname = " by [user]."
|
||||
showname = " by [user]!"
|
||||
if(!(user in viewers(M, null)))
|
||||
showname = "."
|
||||
|
||||
for(var/mob/O in viewers(messagesource, null))
|
||||
if(attack_verb.len)
|
||||
O.show_message("\red <B>[M] has been [pick(attack_verb)] with [src][showname] </B>", 1)
|
||||
else
|
||||
O.show_message("\red <B>[M] has been attacked with [src][showname] </B>", 1)
|
||||
if(attack_verb && attack_verb.len)
|
||||
M.visible_message("<span class='danger'>[M] has been [pick(attack_verb)] with [src][showname]</span>",
|
||||
"<span class='userdanger'>[M] has been [pick(attack_verb)] with [src][showname]!</span>")
|
||||
else if(force == 0)
|
||||
M.visible_message("<span class='danger'>[M] has been [pick("tapped","patted")] with [src][showname]</span>",
|
||||
"<span class='userdanger'>[M] has been [pick("tapped","patted")] with [src][showname]</span>")
|
||||
else
|
||||
M.visible_message("<span class='danger'>[M] has been attacked with [src][showname]</span>",
|
||||
"<span class='userdanger'>[M] has been attacked with [src][showname]</span>")
|
||||
|
||||
if(!showname && user)
|
||||
if(user.client)
|
||||
@@ -146,7 +160,7 @@
|
||||
else
|
||||
|
||||
M.take_organ_damage(power)
|
||||
if (prob(33)) // Added blood for whacking non-humans too
|
||||
if (prob(33) && src.force) // Added blood for whacking non-humans too
|
||||
var/turf/location = M.loc
|
||||
if (istype(location, /turf/simulated))
|
||||
location.add_blood_floor(M)
|
||||
@@ -156,4 +170,4 @@
|
||||
M << "Aargh it burns!"
|
||||
M.updatehealth()
|
||||
add_fingerprint(user)
|
||||
return 1
|
||||
return 1
|
||||
@@ -29,9 +29,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_no_default = 0 // vote does not default to nochange/norestart (tbi)
|
||||
@@ -213,12 +210,6 @@
|
||||
config.allow_vote_restart = 1
|
||||
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")
|
||||
config.vote_no_dead = 1
|
||||
if("default_no_vote")
|
||||
|
||||
+81
-81
@@ -1,81 +1,81 @@
|
||||
//TODO: rewrite and standardise all controller datums to the datum/controller type
|
||||
//TODO: allow all controllers to be deleted for clean restarts (see WIP master controller stuff) - MC done - lighting done
|
||||
|
||||
/client/proc/restart_controller(controller in list("Master","Failsafe","Lighting","Supply Shuttle"))
|
||||
set category = "Debug"
|
||||
set name = "Restart Controller"
|
||||
set desc = "Restart one of the various periodic loop controllers for the game (be careful!)"
|
||||
|
||||
if(!holder) return
|
||||
usr = null
|
||||
src = null
|
||||
switch(controller)
|
||||
if("Master")
|
||||
new /datum/controller/game_controller()
|
||||
master_controller.process()
|
||||
feedback_add_details("admin_verb","RMC")
|
||||
if("Failsafe")
|
||||
new /datum/controller/failsafe()
|
||||
feedback_add_details("admin_verb","RFailsafe")
|
||||
if("Lighting")
|
||||
new /datum/controller/lighting()
|
||||
lighting_controller.process()
|
||||
feedback_add_details("admin_verb","RLighting")
|
||||
if("Supply Shuttle")
|
||||
supply_shuttle.process()
|
||||
feedback_add_details("admin_verb","RSupply")
|
||||
message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.")
|
||||
return
|
||||
|
||||
|
||||
/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply Shuttle","Emergency Shuttle","Configuration","pAI", "Cameras", "Events"))
|
||||
set category = "Debug"
|
||||
set name = "Debug Controller"
|
||||
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
|
||||
|
||||
if(!holder) return
|
||||
switch(controller)
|
||||
if("Master")
|
||||
debug_variables(master_controller)
|
||||
feedback_add_details("admin_verb","DMC")
|
||||
if("Failsafe")
|
||||
debug_variables(Failsafe)
|
||||
feedback_add_details("admin_verb","DFailsafe")
|
||||
if("Ticker")
|
||||
debug_variables(ticker)
|
||||
feedback_add_details("admin_verb","DTicker")
|
||||
if("Lighting")
|
||||
debug_variables(lighting_controller)
|
||||
feedback_add_details("admin_verb","DLighting")
|
||||
if("Air")
|
||||
debug_variables(air_master)
|
||||
feedback_add_details("admin_verb","DAir")
|
||||
if("Jobs")
|
||||
debug_variables(job_master)
|
||||
feedback_add_details("admin_verb","DJobs")
|
||||
if("Sun")
|
||||
debug_variables(sun)
|
||||
feedback_add_details("admin_verb","DSun")
|
||||
if("Radio")
|
||||
debug_variables(radio_controller)
|
||||
feedback_add_details("admin_verb","DRadio")
|
||||
if("Supply Shuttle")
|
||||
debug_variables(supply_shuttle)
|
||||
feedback_add_details("admin_verb","DSupply")
|
||||
if("Emergency Shuttle")
|
||||
debug_variables(emergency_shuttle)
|
||||
feedback_add_details("admin_verb","DEmergency")
|
||||
if("Configuration")
|
||||
debug_variables(config)
|
||||
feedback_add_details("admin_verb","DConf")
|
||||
if("pAI")
|
||||
debug_variables(paiController)
|
||||
feedback_add_details("admin_verb","DpAI")
|
||||
if("Cameras")
|
||||
debug_variables(cameranet)
|
||||
feedback_add_details("admin_verb","DCameras")
|
||||
if("Events")
|
||||
debug_variables(events)
|
||||
feedback_add_details("admin_verb","DEvents")
|
||||
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.")
|
||||
return
|
||||
//TODO: rewrite and standardise all controller datums to the datum/controller type
|
||||
//TODO: allow all controllers to be deleted for clean restarts (see WIP master controller stuff) - MC done - lighting done
|
||||
|
||||
/client/proc/restart_controller(controller in list("Master","Failsafe","Lighting","Supply Shuttle"))
|
||||
set category = "Debug"
|
||||
set name = "Restart Controller"
|
||||
set desc = "Restart one of the various periodic loop controllers for the game (be careful!)"
|
||||
|
||||
if(!holder) return
|
||||
usr = null
|
||||
src = null
|
||||
switch(controller)
|
||||
if("Master")
|
||||
new /datum/controller/game_controller()
|
||||
master_controller.process()
|
||||
feedback_add_details("admin_verb","RMC")
|
||||
if("Failsafe")
|
||||
new /datum/controller/failsafe()
|
||||
feedback_add_details("admin_verb","RFailsafe")
|
||||
if("Lighting")
|
||||
new /datum/controller/lighting()
|
||||
lighting_controller.process()
|
||||
feedback_add_details("admin_verb","RLighting")
|
||||
if("Supply Shuttle")
|
||||
supply_shuttle.process()
|
||||
feedback_add_details("admin_verb","RSupply")
|
||||
message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.")
|
||||
return
|
||||
|
||||
|
||||
/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply Shuttle","Emergency Shuttle","Configuration","pAI", "Cameras", "Events"))
|
||||
set category = "Debug"
|
||||
set name = "Debug Controller"
|
||||
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
|
||||
|
||||
if(!holder) return
|
||||
switch(controller)
|
||||
if("Master")
|
||||
debug_variables(master_controller)
|
||||
feedback_add_details("admin_verb","DMC")
|
||||
if("Failsafe")
|
||||
debug_variables(Failsafe)
|
||||
feedback_add_details("admin_verb","DFailsafe")
|
||||
if("Ticker")
|
||||
debug_variables(ticker)
|
||||
feedback_add_details("admin_verb","DTicker")
|
||||
if("Lighting")
|
||||
debug_variables(lighting_controller)
|
||||
feedback_add_details("admin_verb","DLighting")
|
||||
if("Air")
|
||||
debug_variables(air_master)
|
||||
feedback_add_details("admin_verb","DAir")
|
||||
if("Jobs")
|
||||
debug_variables(job_master)
|
||||
feedback_add_details("admin_verb","DJobs")
|
||||
if("Sun")
|
||||
debug_variables(sun)
|
||||
feedback_add_details("admin_verb","DSun")
|
||||
if("Radio")
|
||||
debug_variables(radio_controller)
|
||||
feedback_add_details("admin_verb","DRadio")
|
||||
if("Supply Shuttle")
|
||||
debug_variables(supply_shuttle)
|
||||
feedback_add_details("admin_verb","DSupply")
|
||||
if("Emergency Shuttle")
|
||||
debug_variables(emergency_shuttle)
|
||||
feedback_add_details("admin_verb","DEmergency")
|
||||
if("Configuration")
|
||||
debug_variables(config)
|
||||
feedback_add_details("admin_verb","DConf")
|
||||
if("pAI")
|
||||
debug_variables(paiController)
|
||||
feedback_add_details("admin_verb","DpAI")
|
||||
if("Cameras")
|
||||
debug_variables(cameranet)
|
||||
feedback_add_details("admin_verb","DCameras")
|
||||
if("Events")
|
||||
debug_variables(events)
|
||||
feedback_add_details("admin_verb","DEvents")
|
||||
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.")
|
||||
return
|
||||
|
||||
@@ -265,6 +265,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>"
|
||||
|
||||
@@ -634,6 +635,38 @@ 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"])
|
||||
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]")
|
||||
|
||||
href_list["datumrefresh"] = href_list["addreagent"]
|
||||
|
||||
else if(href_list["explode"])
|
||||
if(!check_rights(R_FUN)) return
|
||||
|
||||
|
||||
@@ -847,7 +847,25 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
cost = 8
|
||||
containertype = /obj/structure/largecrate
|
||||
containername = "water tank crate"
|
||||
|
||||
|
||||
/datum/supply_packs/misc/lasertag
|
||||
name = "LaserTag Crate"
|
||||
contains = list(/obj/item/weapon/gun/energy/laser/redtag,
|
||||
/obj/item/weapon/gun/energy/laser/redtag,
|
||||
/obj/item/weapon/gun/energy/laser/redtag,
|
||||
/obj/item/weapon/gun/energy/laser/bluetag,
|
||||
/obj/item/weapon/gun/energy/laser/bluetag,
|
||||
/obj/item/weapon/gun/energy/laser/bluetag,
|
||||
/obj/item/clothing/suit/redtag,
|
||||
/obj/item/clothing/suit/redtag,
|
||||
/obj/item/clothing/suit/redtag,
|
||||
/obj/item/clothing/suit/bluetag,
|
||||
/obj/item/clothing/suit/bluetag,
|
||||
/obj/item/clothing/suit/bluetag,
|
||||
/obj/item/clothing/head/helmet/redtaghelm,
|
||||
/obj/item/clothing/head/helmet/bluetaghelm)
|
||||
cost = 15
|
||||
containername = "LaserTag Crate"
|
||||
|
||||
///////////// Paper Work
|
||||
|
||||
|
||||
@@ -447,6 +447,14 @@ var/list/uplink_items = list()
|
||||
cost = 10
|
||||
excludefrom = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/badass/syndiecards
|
||||
name = "Syndicate Playing Cards"
|
||||
desc = "A special deck of space-grade playing cards with a mono-molecular edge and metal reinforcement, making them lethal weapons both when wielded as a blade and when thrown. \
|
||||
You can also play card games with them."
|
||||
item = /obj/item/toy/cards/deck/syndicate
|
||||
cost = 1
|
||||
excludefrom = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/badass/balloon
|
||||
name = "For showing that you are The Boss"
|
||||
desc = "A useless red balloon with the syndicate logo on it, which can blow the deepest of covers."
|
||||
|
||||
@@ -124,7 +124,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
|
||||
switch(index)
|
||||
if(AIRLOCK_WIRE_IDSCAN)
|
||||
//Sending a pulse through this flashes the red light on the door (if the door has power).
|
||||
if((A.arePowerSystemsOn()) && (!(A.stat & NOPOWER)))
|
||||
if((A.arePowerSystemsOn()) && (!(A.stat & NOPOWER)) && A.density)
|
||||
A.do_animate("deny")
|
||||
if(AIRLOCK_WIRE_MAIN_POWER1 || AIRLOCK_WIRE_MAIN_POWER2)
|
||||
//Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter).
|
||||
|
||||
@@ -117,14 +117,17 @@
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "bike_horn"
|
||||
item_state = "bike_horn"
|
||||
hitsound = 'sound/items/bikehorn.ogg'
|
||||
throwforce = 3
|
||||
hitsound = null //To prevent tap.ogg playing, as the item lacks of force
|
||||
w_class = 1.0
|
||||
throw_speed = 3
|
||||
throw_range = 15
|
||||
attack_verb = list("HONKED")
|
||||
var/spam_flag = 0
|
||||
|
||||
/obj/item/weapon/bikehorn/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1) //plays instead of tap.ogg!
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/c_tube
|
||||
name = "cardboard tube"
|
||||
@@ -371,10 +374,7 @@
|
||||
m_amt = 15000
|
||||
origin_tech = "materials=2;combat=1"
|
||||
attack_verb = list("chopped", "torn", "cut")
|
||||
|
||||
/obj/item/weapon/hatchet/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
||||
return ..()
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
/obj/item/weapon/scythe
|
||||
icon_state = "scythe0"
|
||||
@@ -389,6 +389,7 @@
|
||||
slot_flags = SLOT_BACK
|
||||
origin_tech = "materials=2;combat=2"
|
||||
attack_verb = list("chopped", "sliced", "cut", "reaped")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
/obj/item/weapon/scythe/afterattack(atom/A, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
M.take_organ_damage(20)
|
||||
|
||||
|
||||
/atom/proc/CheckParts()
|
||||
return
|
||||
|
||||
/atom/proc/assume_air(datum/gas_mixture/giver)
|
||||
del(giver)
|
||||
@@ -280,6 +282,12 @@ var/list/blood_splatter_icons = list()
|
||||
overlays += blood_splatter_icon
|
||||
return 1 //we applied blood to the item
|
||||
|
||||
/obj/item/clothing/gloves/add_blood(mob/living/carbon/M)
|
||||
if(..() == 0) return 0
|
||||
transfer_blood = rand(2, 4)
|
||||
bloody_hands_mob = M
|
||||
return 1
|
||||
|
||||
/turf/simulated/add_blood(mob/living/carbon/M)
|
||||
if(..() == 0) return 0
|
||||
|
||||
@@ -291,6 +299,8 @@ var/list/blood_splatter_icons = list()
|
||||
/mob/living/carbon/human/add_blood(mob/living/carbon/M)
|
||||
if(..() == 0) return 0
|
||||
add_blood_list(M)
|
||||
bloody_hands = rand(2, 4)
|
||||
bloody_hands_mob = M
|
||||
update_inv_gloves() //handles bloody hands overlays and updating
|
||||
return 1 //we applied blood to the item
|
||||
|
||||
|
||||
+4
-4
@@ -94,7 +94,7 @@
|
||||
domutcheck(owner)
|
||||
|
||||
check_dna_integrity(owner)
|
||||
return owner.dna
|
||||
return
|
||||
|
||||
/proc/check_dna_integrity(mob/living/carbon/character)
|
||||
if(!(istype(character, /mob/living/carbon/human) || istype(character, /mob/living/carbon/monkey))) //Evict xenos from carbon 2012
|
||||
@@ -347,8 +347,8 @@
|
||||
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
|
||||
component_parts += new /obj/item/weapon/cable_coil(null, 1)
|
||||
component_parts += new /obj/item/weapon/cable_coil(null, 1)
|
||||
component_parts += new /obj/item/stack/cable_coil(null, 1)
|
||||
component_parts += new /obj/item/stack/cable_coil(null, 1)
|
||||
RefreshParts()
|
||||
|
||||
|
||||
@@ -920,7 +920,7 @@
|
||||
if("pulsese")
|
||||
var/len = length(viable_occupant.dna.struc_enzymes)
|
||||
num = Wrap(num, 1, len+1)
|
||||
num = randomize_radiation_accuracy(num, radduration, len)
|
||||
num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len)
|
||||
|
||||
var/block = round((num-1)/DNA_BLOCK_SIZE)+1
|
||||
var/subblock = num - block*DNA_BLOCK_SIZE
|
||||
|
||||
@@ -9,7 +9,7 @@ var/list/blob_nodes = list()
|
||||
/datum/game_mode/blob
|
||||
name = "blob"
|
||||
config_tag = "blob"
|
||||
antag_flag = BE_ALIEN
|
||||
antag_flag = BE_BLOB
|
||||
|
||||
required_players = 30
|
||||
required_enemies = 1
|
||||
|
||||
@@ -63,9 +63,9 @@
|
||||
..()
|
||||
|
||||
|
||||
/obj/effect/blob/core/proc/create_overmind(var/client/new_overmind)
|
||||
/obj/effect/blob/core/proc/create_overmind(var/client/new_overmind, var/override_delay)
|
||||
|
||||
if(overmind_get_delay > world.time)
|
||||
if(overmind_get_delay > world.time && !override_delay)
|
||||
return
|
||||
|
||||
overmind_get_delay = world.time + 300 // 30 seconds
|
||||
@@ -77,7 +77,7 @@
|
||||
var/list/candidates = list()
|
||||
|
||||
if(!new_overmind)
|
||||
candidates = get_candidates(BE_ALIEN)
|
||||
candidates = get_candidates(BE_BLOB)
|
||||
if(candidates.len)
|
||||
C = pick(candidates)
|
||||
else
|
||||
|
||||
@@ -45,6 +45,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
|
||||
@@ -75,6 +76,36 @@
|
||||
factory.spores += src
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/blobspore/Life()
|
||||
|
||||
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.hair_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
|
||||
@@ -94,4 +125,7 @@
|
||||
/mob/living/simple_animal/hostile/blobspore/Del()
|
||||
if(factory)
|
||||
factory.spores -= src
|
||||
if(contents)
|
||||
for(var/mob/M in contents)
|
||||
M.loc = src.loc
|
||||
..()
|
||||
|
||||
@@ -277,9 +277,14 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
||||
U << "<span class='warning'>We could gain no benefit from absorbing a lesser creature.</span>"
|
||||
return 0
|
||||
|
||||
if(T.dna in absorbed_dna)
|
||||
U << "<span class='warning'>We already have that DNA in storage.</span>"
|
||||
return 0
|
||||
for(var/datum/dna/D in absorbed_dna)
|
||||
if(T.dna.uni_identity == D.uni_identity)
|
||||
if(T.dna.struc_enzymes == D.struc_enzymes)
|
||||
if(T.dna.real_name == D.real_name)
|
||||
if(T.dna.mutantrace == D.mutantrace)
|
||||
if(T.dna.blood_type == D.blood_type)
|
||||
U << "<span class='warning'>We already have that DNA in storage.</span>"
|
||||
return 0
|
||||
|
||||
if(!check_dna_integrity(T))
|
||||
U << "<span class='warning'>[T] is not compatible with our biology.</span>"
|
||||
@@ -292,7 +297,13 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
||||
/datum/changeling/proc/absorb_dna(mob/living/carbon/T)
|
||||
shuffle_dna()
|
||||
T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set.
|
||||
absorbed_dna |= T.dna //And add the target DNA to our absorbed list.
|
||||
var/datum/dna/new_dna = new T.dna.type
|
||||
new_dna.uni_identity = T.dna.uni_identity
|
||||
new_dna.struc_enzymes = T.dna.struc_enzymes
|
||||
new_dna.real_name = T.dna.real_name
|
||||
new_dna.mutantrace = T.dna.mutantrace
|
||||
new_dna.blood_type = T.dna.blood_type
|
||||
absorbed_dna |= new_dna //And add the target DNA to our absorbed list.
|
||||
absorbedcount++ //all that done, let's increment the objective counter.
|
||||
|
||||
/datum/changeling/proc/shuffle_dna()//boots out the stalest DNA.
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
//This only contains the arm blade for now because I'm a lazy fuck. Yers truely, Miauw, resident lazy fuck.
|
||||
/obj/item/weapon/melee/arm_blade
|
||||
name = "arm blade"
|
||||
desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter"
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "arm_blade"
|
||||
item_state = "arm_blade"
|
||||
flags = ABSTRACT
|
||||
w_class = 5.0
|
||||
force = 25
|
||||
throwforce = 0 //Just to be on the safe side
|
||||
throw_range = 0
|
||||
throw_speed = 0
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/New()
|
||||
..()
|
||||
if(ismob(loc))
|
||||
loc.visible_message("<span class='warning'>A grotesque blade forms around [loc.name]\'s arm!</span>", "<span class='warning'>Our arm twists and mutates, transforming it into a deadly blade.</span>", "<span class='warning'>You hear organic matter ripping and tearing!</span>")
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/dropped(mob/user)
|
||||
visible_message("<span class='warning'>With a sickening crunch, [user] reforms his blade into an arm!</span>", "<span class='notice'>We assimilate our blade into our body</span>", "<span class='warning>You hear organic matter ripping and tearing!</span>")
|
||||
del src
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
if(istype(target, /obj/structure/table))
|
||||
var/obj/structure/table/T = target
|
||||
T.table_destroy(1, user)
|
||||
|
||||
else if(istype(target, /obj/machinery/computer))
|
||||
var/obj/machinery/computer/C = target
|
||||
C.attack_alien(user) //muh copypasta
|
||||
|
||||
else if(istype(target, /obj/machinery/door/airlock))
|
||||
var/obj/machinery/door/airlock/A = target
|
||||
|
||||
if(!A.requiresID() || A.allowed(user)) //This is to prevent stupid shit like hitting a door with an arm blade, the door opening because you have acces and still getting a "the airlocks motors resist our efforts to force it" message.
|
||||
return
|
||||
|
||||
if(A.arePowerSystemsOn() && !(A.stat & NOPOWER))
|
||||
user << "<span class='notice'>The airlock's motors resist our efforts to force it.</span>"
|
||||
return
|
||||
|
||||
else if(A.locked)
|
||||
user << "<span class='notice'>The airlock's bolts prevent it from being forced.</span>"
|
||||
return
|
||||
|
||||
else
|
||||
//user.say("Heeeeeeeeeerrre's Johnny!")
|
||||
user.visible_message("<span class='warning'>[user] forces the door to open with \his [src]!</span>", "<span class='warning'>We force the door to open.</span>", "<span class='warning'>You hear a metal screeching sound.</span>")
|
||||
A.open(1)
|
||||
@@ -118,12 +118,17 @@
|
||||
changeling.absorb_dna(T)
|
||||
|
||||
if(src.nutrition < 400) src.nutrition = min((src.nutrition + T.nutrition), 400)
|
||||
if(T.mind && T.mind.changeling)//If the target was a changeling, suck out their extra juice and objective points!
|
||||
changeling.chem_charges += min(T.mind.changeling.chem_charges, changeling.chem_storage)
|
||||
changeling.absorbedcount += T.mind.changeling.absorbedcount
|
||||
|
||||
T.mind.changeling.absorbed_dna.len = 1
|
||||
T.mind.changeling.absorbedcount = 0
|
||||
if(T.mind)//if the victim has got a mind
|
||||
|
||||
T.mind.show_memory(src, 0) //I can read your mind, kekeke. Output all their notes.
|
||||
|
||||
if(T.mind.changeling)//If the target was a changeling, suck out their extra juice and objective points!
|
||||
changeling.chem_charges += min(T.mind.changeling.chem_charges, changeling.chem_storage)
|
||||
changeling.absorbedcount += T.mind.changeling.absorbedcount
|
||||
|
||||
T.mind.changeling.absorbed_dna.len = 1
|
||||
T.mind.changeling.absorbedcount = 0
|
||||
else
|
||||
changeling.chem_charges += 10
|
||||
|
||||
@@ -212,7 +217,8 @@
|
||||
changeling.chem_charges -= 5
|
||||
remove_changeling_powers()
|
||||
src << "<span class='notice'>We transform our appearance.</span>"
|
||||
dna = chosen_dna
|
||||
src.dna = chosen_dna
|
||||
|
||||
|
||||
var/mob/living/carbon/human/O = humanize((TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPSRC),chosen_dna.real_name)
|
||||
|
||||
@@ -529,9 +535,34 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
if(src && src.mind && src.mind.changeling)
|
||||
src.mind.changeling.mimicing = ""
|
||||
|
||||
//////////
|
||||
//STINGS// //They get a pretty header because there's just so fucking many of them ;_;
|
||||
//////////
|
||||
|
||||
/mob/living/carbon/proc/changeling_arm_blade()
|
||||
set category = "Changeling"
|
||||
set name = "Arm Blade (20)"
|
||||
|
||||
if(istype(l_hand, /obj/item/weapon/melee/arm_blade)) //Not the nicest way to do it, but eh
|
||||
u_equip(l_hand)
|
||||
return
|
||||
|
||||
if(istype(r_hand, /obj/item/weapon/melee/arm_blade))
|
||||
u_equip(r_hand)
|
||||
return
|
||||
|
||||
var/datum/changeling/changeling = changeling_power(20)
|
||||
if(!changeling)
|
||||
return
|
||||
|
||||
u_equip(get_active_hand())
|
||||
|
||||
put_in_hands(new /obj/item/weapon/melee/arm_blade(src))
|
||||
changeling.geneticdamage += 6
|
||||
|
||||
changeling.chem_charges -= 20
|
||||
|
||||
|
||||
//////////
|
||||
//STINGS// //They get a pretty header because there's just so fucking many of them ;_;
|
||||
//////////
|
||||
|
||||
/mob/living/carbon/proc/set_sting(A, icon, dna=null) //setting the sting and ui icon for it
|
||||
src << "<span class='notice'>We prepare our sting, use alt+click on target to sting them.</span>"
|
||||
@@ -584,15 +615,13 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
/mob/living/carbon/proc/sting_effect_trasnform(mob/living/carbon/T)
|
||||
if(!sting_can_reach(T, 40))
|
||||
return 0
|
||||
add_logs(src, T, "stung", object="transformation sting", addition="new identity is [src.mind.changeling.chosen_dna.real_name]")
|
||||
add_logs(src, T, "stung", object="transformation sting", addition=" new identity is [src.mind.changeling.chosen_dna.real_name]")
|
||||
if((HUSK in T.mutations) || !check_dna_integrity(T))
|
||||
src << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
|
||||
return 0
|
||||
|
||||
T.dna = src.mind.changeling.chosen_dna
|
||||
T.real_name = src.mind.changeling.chosen_dna.real_name
|
||||
var/datum/dna/NewDNA = src.mind.changeling.chosen_dna
|
||||
hardset_dna(T, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.mutantrace, NewDNA.blood_type)
|
||||
updateappearance(T)
|
||||
domutcheck(T, null)
|
||||
feedback_add_details("changeling_powers","TS")
|
||||
return 1
|
||||
|
||||
@@ -680,4 +709,4 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
T.reagents.add_reagent("ice", 30)
|
||||
|
||||
feedback_add_details("changeling_powers","CS")
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -161,6 +161,13 @@ var/list/powerinstances
|
||||
allowduringlesserform = 1
|
||||
verbpath = /mob/living/carbon/proc/changeling_mute_sting
|
||||
|
||||
/datum/power/changeling/arm_blade
|
||||
name = "Arm Blade"
|
||||
desc = "We reform one of our arms into a deadly blade."
|
||||
helptext = "Cannot be used while in lesser form."
|
||||
genomecost = 1
|
||||
allowduringlesserform = 0
|
||||
verbpath = /mob/living/carbon/proc/changeling_arm_blade
|
||||
|
||||
// Modularchangling, totally stolen from the new player panel. YAYY
|
||||
/datum/changeling/proc/EvolutionMenu()//The new one
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
w_class = 4
|
||||
force = 30
|
||||
throwforce = 10
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
|
||||
/obj/item/weapon/melee/cultblade/attack(mob/living/target as mob, mob/living/carbon/human/user as mob)
|
||||
if(iscultist(user))
|
||||
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
||||
return ..()
|
||||
else
|
||||
user.Paralyse(5)
|
||||
|
||||
@@ -226,12 +226,18 @@ var/list/sacrificed = list()
|
||||
seer()
|
||||
if(usr.loc==src.loc)
|
||||
usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!")
|
||||
if(usr.see_invisible!=0 && usr.see_invisible!=15)
|
||||
usr << "\red The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision."
|
||||
var/mob/living/carbon/human/user = usr
|
||||
if(user.see_invisible!=25 || (istype(user) && user.glasses)) //check for non humans
|
||||
user << "\red The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision."
|
||||
else
|
||||
usr << "\red The world beyond opens to your eyes."
|
||||
usr.see_invisible = SEE_INVISIBLE_OBSERVER
|
||||
usr.seer = 1
|
||||
user << "\red The world beyond opens to your eyes."
|
||||
var/see_temp = user.see_invisible
|
||||
user.see_invisible = SEE_INVISIBLE_OBSERVER
|
||||
user.seer = 1
|
||||
while(user.loc==src.loc)
|
||||
sleep(30)
|
||||
user.seer = 0
|
||||
user.see_invisible = see_temp
|
||||
return
|
||||
return fizzle()
|
||||
|
||||
|
||||
@@ -319,28 +319,29 @@ var/global/datum/controller/gameticker/ticker
|
||||
/datum/controller/gameticker/proc/declare_completion()
|
||||
|
||||
for (var/mob/living/silicon/ai/aiPlayer in mob_list)
|
||||
if (aiPlayer.stat != 2)
|
||||
world << "<b>[aiPlayer.name] (Played by: [aiPlayer.key])'s laws at the end of the game were:</b>"
|
||||
else
|
||||
world << "<b>[aiPlayer.name] (Played by: [aiPlayer.key])'s laws when it was deactivated were:</b>"
|
||||
aiPlayer.show_laws(1)
|
||||
if (aiPlayer.stat != 2 && aiPlayer.mind)
|
||||
world << "<b>[aiPlayer.name] (Played by: [aiPlayer.mind.key])'s laws at the end of the game were:</b>"
|
||||
aiPlayer.show_laws(1)
|
||||
else if (aiPlayer.mind) //if the dead ai has a mind, use its key instead
|
||||
world << "<b>[aiPlayer.name] (Played by: [aiPlayer.mind.key])'s laws when it was deactivated were:</b>"
|
||||
aiPlayer.show_laws(1)
|
||||
|
||||
if (aiPlayer.connected_robots.len)
|
||||
var/robolist = "<b>[aiPlayer.real_name]'s loyal minions were:</b> "
|
||||
var/vsrobolist = "\red <b>[aiPlayer.real_name]'s disloyal minions were:</b> \black"
|
||||
for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots)
|
||||
if (is_special_character(robo))
|
||||
vsrobolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.key]), ":" (Played by: [robo.key]), "]"
|
||||
if (is_special_character(robo) && robo.mind)
|
||||
vsrobolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.mind.key]), ":" (Played by: [robo.mind.key]), "]"
|
||||
continue
|
||||
robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.key]), ":" (Played by: [robo.key]), "]"
|
||||
robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.mind.key]), ":" (Played by: [robo.mind.key]), "]"
|
||||
world << "[robolist]"
|
||||
world << "[vsrobolist]"
|
||||
for (var/mob/living/silicon/robot/robo in mob_list)
|
||||
if (!robo.connected_ai)
|
||||
if (robo.stat != 2)
|
||||
world << "<b>[robo.name] (Played by: [robo.key]) survived as an AI-less borg! Its laws were:</b>"
|
||||
world << "<b>[robo.name] (Played by: [robo.mind.key]) survived as an AI-less borg! Its laws were:</b>"
|
||||
else
|
||||
world << "<b>[robo.name] (Played by: [robo.key]) was unable to survive the rigors of being a cyborg without an AI. Its laws were:</b>"
|
||||
world << "<b>[robo.name] (Played by: [robo.mind.key]) was unable to survive the rigors of being a cyborg without an AI. Its laws were:</b>"
|
||||
|
||||
if(robo) //How the hell do we lose robo between here and the world messages directly above this?
|
||||
robo.laws.show_laws(world)
|
||||
|
||||
@@ -123,12 +123,10 @@
|
||||
mode = 2
|
||||
switch(alert("Search for item signature or DNA fragment?" , "Signature Mode Select" , "" , "Item" , "DNA"))
|
||||
if("Item")
|
||||
var/datum/objective/steal/itemlist
|
||||
itemlist = itemlist // To supress a 'variable defined but not used' error.
|
||||
var/targetitem = input("Select item to search for.", "Item Mode Select","") as null|anything in itemlist.possible_items
|
||||
var/targetitem = input("Select item to search for.", "Item Mode Select","") as null|anything in possible_items
|
||||
if(!targetitem)
|
||||
return
|
||||
target=locate(itemlist.possible_items[targetitem])
|
||||
target=locate(possible_items[targetitem])
|
||||
if(!target)
|
||||
usr << "Failed to locate [targetitem]!"
|
||||
return
|
||||
|
||||
+314
-434
@@ -4,266 +4,244 @@ datum/objective
|
||||
var/datum/mind/target = null //If they are focused on a particular person.
|
||||
var/target_amount = 0 //If they are focused on a particular number. Steal objectives have their own counter.
|
||||
var/completed = 0 //currently only used for custom objectives.
|
||||
var/dangerrating = 0 //How hard the objective is, essentially. Used for dishing out objectives and checking overall victory.
|
||||
|
||||
New(var/text)
|
||||
if(text)
|
||||
explanation_text = text
|
||||
datum/objective/New(var/text)
|
||||
if(text)
|
||||
explanation_text = text
|
||||
|
||||
proc/check_completion()
|
||||
return completed
|
||||
datum/objective/proc/check_completion()
|
||||
return completed
|
||||
|
||||
proc/find_target()
|
||||
var/list/possible_targets = list()
|
||||
for(var/datum/mind/possible_target in ticker.minds)
|
||||
if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2))
|
||||
possible_targets += possible_target
|
||||
if(possible_targets.len > 0)
|
||||
target = pick(possible_targets)
|
||||
update_explanation_text()
|
||||
datum/objective/proc/find_target()
|
||||
var/list/possible_targets = list()
|
||||
for(var/datum/mind/possible_target in ticker.minds)
|
||||
if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2))
|
||||
possible_targets += possible_target
|
||||
if(possible_targets.len > 0)
|
||||
target = pick(possible_targets)
|
||||
update_explanation_text()
|
||||
return target
|
||||
|
||||
datum/objective/proc/find_target_by_role(role, role_type=0)//Option sets either to check assigned role or special role. Default to assigned.
|
||||
for(var/datum/mind/possible_target in ticker.minds)
|
||||
if((possible_target != owner) && ishuman(possible_target.current) && ((role_type ? possible_target.special_role : possible_target.assigned_role) == role) )
|
||||
target = possible_target
|
||||
break
|
||||
update_explanation_text()
|
||||
|
||||
proc/find_target_by_role(role, role_type=0)//Option sets either to check assigned role or special role. Default to assigned.
|
||||
for(var/datum/mind/possible_target in ticker.minds)
|
||||
if((possible_target != owner) && ishuman(possible_target.current) && ((role_type ? possible_target.special_role : possible_target.assigned_role) == role) )
|
||||
target = possible_target
|
||||
break
|
||||
update_explanation_text()
|
||||
datum/objective/proc/update_explanation_text()
|
||||
//Default does nothing, override where needed
|
||||
|
||||
proc/update_explanation_text()
|
||||
//Default does nothing, override where needed
|
||||
|
||||
|
||||
datum/objective/assassinate
|
||||
var/target_role_type=0
|
||||
dangerrating = 10
|
||||
|
||||
find_target()
|
||||
..()
|
||||
return target
|
||||
datum/objective/assassinate/find_target_by_role(role, role_type=0)
|
||||
target_role_type = role_type
|
||||
..(role, role_type)
|
||||
return target
|
||||
|
||||
find_target_by_role(role, role_type=0)
|
||||
target_role_type = role_type
|
||||
..(role, role_type)
|
||||
return target
|
||||
datum/objective/assassinate/check_completion()
|
||||
if(target && target.current)
|
||||
if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite
|
||||
return 1
|
||||
return 0
|
||||
return 1
|
||||
|
||||
datum/objective/assassinate/update_explanation_text()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "Assassinate [target.current.real_name], the [!target_role_type ? target.assigned_role : target.special_role]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
|
||||
|
||||
check_completion()
|
||||
if(target && target.current)
|
||||
if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite
|
||||
return 1
|
||||
return 0
|
||||
return 1
|
||||
|
||||
update_explanation_text()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "Assassinate [target.current.real_name], the [!target_role_type ? target.assigned_role : target.special_role]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
|
||||
datum/objective/mutiny
|
||||
var/target_role_type=0
|
||||
|
||||
find_target()
|
||||
..()
|
||||
return target
|
||||
datum/objective/mutiny/find_target_by_role(role, role_type=0)
|
||||
target_role_type = role_type
|
||||
..(role, role_type)
|
||||
return target
|
||||
|
||||
find_target_by_role(role, role_type=0)
|
||||
target_role_type = role_type
|
||||
..(role, role_type)
|
||||
return target
|
||||
datum/objective/mutiny/check_completion()
|
||||
if(target && target.current)
|
||||
if(target.current.stat == DEAD || !ishuman(target.current) || !target.current.ckey || !target.current.client)
|
||||
return 1
|
||||
var/turf/T = get_turf(target.current)
|
||||
if(T && (T.z != 1)) //If they leave the station they count as dead for this
|
||||
return 2
|
||||
return 0
|
||||
return 1
|
||||
|
||||
datum/objective/mutiny/update_explanation_text()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "Assassinate [target.current.real_name], the [!target_role_type ? target.assigned_role : target.special_role]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
|
||||
|
||||
check_completion()
|
||||
if(target && target.current)
|
||||
if(target.current.stat == DEAD || !ishuman(target.current) || !target.current.ckey || !target.current.client)
|
||||
return 1
|
||||
var/turf/T = get_turf(target.current)
|
||||
if(T && (T.z != 1)) //If they leave the station they count as dead for this
|
||||
return 2
|
||||
return 0
|
||||
return 1
|
||||
|
||||
update_explanation_text()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "Assassinate [target.current.real_name], the [!target_role_type ? target.assigned_role : target.special_role]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
|
||||
datum/objective/debrain//I want braaaainssss
|
||||
var/target_role_type=0
|
||||
dangerrating = 20
|
||||
|
||||
find_target()
|
||||
..()
|
||||
return target
|
||||
datum/objective/debrain/find_target_by_role(role, role_type=0)
|
||||
target_role_type = role_type
|
||||
..(role, role_type)
|
||||
return target
|
||||
|
||||
find_target_by_role(role, role_type=0)
|
||||
target_role_type = role_type
|
||||
..(role, role_type)
|
||||
return target
|
||||
|
||||
|
||||
check_completion()
|
||||
if(!target)//If it's a free objective.
|
||||
return 1
|
||||
if( !owner.current || owner.current.stat==DEAD )//If you're otherwise dead.
|
||||
return 0
|
||||
if( !target.current || !isbrain(target.current) )
|
||||
return 0
|
||||
var/atom/A = target.current
|
||||
while(A.loc) //check to see if the brainmob is on our person
|
||||
A = A.loc
|
||||
if(A == owner.current)
|
||||
return 1
|
||||
datum/objective/debrain/check_completion()
|
||||
if(!target)//If it's a free objective.
|
||||
return 1
|
||||
if( !owner.current || owner.current.stat==DEAD )//If you're otherwise dead.
|
||||
return 0
|
||||
if( !target.current || !isbrain(target.current) )
|
||||
return 0
|
||||
var/atom/A = target.current
|
||||
while(A.loc) //check to see if the brainmob is on our person
|
||||
A = A.loc
|
||||
if(A == owner.current)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
datum/objective/debrain/update_explanation_text()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "Steal the brain of [target.current.real_name], the [!target_role_type ? target.assigned_role : target.special_role]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
|
||||
|
||||
update_explanation_text()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "Steal the brain of [target.current.real_name], the [!target_role_type ? target.assigned_role : target.special_role]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
|
||||
datum/objective/protect//The opposite of killing a dude.
|
||||
var/target_role_type=0
|
||||
dangerrating = 10
|
||||
|
||||
find_target()
|
||||
..()
|
||||
return target
|
||||
datum/objective/protect/find_target_by_role(role, role_type=0)
|
||||
target_role_type = role_type
|
||||
..(role, role_type)
|
||||
return target
|
||||
|
||||
find_target_by_role(role, role_type=0)
|
||||
target_role_type = role_type
|
||||
..(role, role_type)
|
||||
return target
|
||||
datum/objective/protect/check_completion()
|
||||
if(!target) //If it's a free objective.
|
||||
return 1
|
||||
if(target.current)
|
||||
if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current))
|
||||
return 0
|
||||
return 1
|
||||
return 0
|
||||
|
||||
datum/objective/protect/update_explanation_text()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "Protect [target.current.real_name], the [!target_role_type ? target.assigned_role : target.special_role]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
|
||||
|
||||
check_completion()
|
||||
if(!target) //If it's a free objective.
|
||||
return 1
|
||||
if(target.current)
|
||||
if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current))
|
||||
return 0
|
||||
return 1
|
||||
return 0
|
||||
|
||||
update_explanation_text()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "Protect [target.current.real_name], the [!target_role_type ? target.assigned_role : target.special_role]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
|
||||
datum/objective/hijack
|
||||
explanation_text = "Hijack the emergency shuttle by escaping alone."
|
||||
dangerrating = 25
|
||||
|
||||
check_completion()
|
||||
if(!owner.current || owner.current.stat)
|
||||
return 0
|
||||
if(emergency_shuttle.location<2)
|
||||
return 0
|
||||
if(issilicon(owner.current))
|
||||
return 0
|
||||
var/area/shuttle = locate(/area/shuttle/escape/centcom)
|
||||
datum/objective/hijack/check_completion()
|
||||
if(!owner.current || owner.current.stat)
|
||||
return 0
|
||||
if(emergency_shuttle.location<2)
|
||||
return 0
|
||||
if(issilicon(owner.current))
|
||||
return 0
|
||||
var/area/shuttle = locate(/area/shuttle/escape/centcom)
|
||||
|
||||
if(!(get_turf(owner.current) in shuttle))
|
||||
return 0
|
||||
if(!(get_turf(owner.current) in shuttle))
|
||||
return 0
|
||||
|
||||
var/list/protected_mobs = list(/mob/living/silicon/ai, /mob/living/silicon/pai)
|
||||
for(var/mob/living/player in player_list)
|
||||
if(player.type in protected_mobs) continue
|
||||
if (player.mind && (player.mind != owner))
|
||||
if(player.stat != DEAD) //they're not dead!
|
||||
if(get_turf(player) in shuttle)
|
||||
return 0
|
||||
return 1
|
||||
var/list/protected_mobs = list(/mob/living/silicon/ai, /mob/living/silicon/pai)
|
||||
for(var/mob/living/player in player_list)
|
||||
if(player.type in protected_mobs) continue
|
||||
if (player.mind && (player.mind != owner))
|
||||
if(player.stat != DEAD) //they're not dead!
|
||||
if(get_turf(player) in shuttle)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
datum/objective/block
|
||||
explanation_text = "Do not allow any organic lifeforms to escape on the shuttle alive."
|
||||
dangerrating = 25
|
||||
|
||||
datum/objective/block/check_completion()
|
||||
if(!istype(owner.current, /mob/living/silicon))
|
||||
return 0
|
||||
if(emergency_shuttle.location<2)
|
||||
return 0
|
||||
if(!owner.current)
|
||||
return 0
|
||||
var/area/shuttle = locate(/area/shuttle/escape/centcom)
|
||||
var/protected_mobs[] = list(/mob/living/silicon/ai, /mob/living/silicon/pai, /mob/living/silicon/robot)
|
||||
for(var/mob/living/player in player_list)
|
||||
if(player.type in protected_mobs) continue
|
||||
if (player.mind)
|
||||
if (player.stat != 2)
|
||||
if (get_turf(player) in shuttle)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
check_completion()
|
||||
if(!istype(owner.current, /mob/living/silicon))
|
||||
return 0
|
||||
if(emergency_shuttle.location<2)
|
||||
return 0
|
||||
if(!owner.current)
|
||||
return 0
|
||||
var/area/shuttle = locate(/area/shuttle/escape/centcom)
|
||||
var/protected_mobs[] = list(/mob/living/silicon/ai, /mob/living/silicon/pai, /mob/living/silicon/robot)
|
||||
for(var/mob/living/player in player_list)
|
||||
if(player.type in protected_mobs) continue
|
||||
if (player.mind)
|
||||
if (player.stat != 2)
|
||||
if (get_turf(player) in shuttle)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
datum/objective/silence
|
||||
explanation_text = "Do not allow anyone to escape the station. Only allow the shuttle to be called when everyone is dead and your story is the only one left."
|
||||
|
||||
check_completion()
|
||||
if(emergency_shuttle.location<2)
|
||||
return 0
|
||||
|
||||
for(var/mob/living/player in player_list)
|
||||
if(player == owner.current)
|
||||
continue
|
||||
if(player.mind)
|
||||
if(player.stat != DEAD)
|
||||
var/turf/T = get_turf(player)
|
||||
if(!T) continue
|
||||
switch(T.loc.type)
|
||||
if(/area/shuttle/escape/centcom, /area/shuttle/escape_pod1/centcom, /area/shuttle/escape_pod2/centcom, /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod4/centcom)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
datum/objective/escape
|
||||
explanation_text = "Escape on the shuttle or an escape pod alive."
|
||||
dangerrating = 5
|
||||
|
||||
datum/objective/escape/check_completion()
|
||||
if(issilicon(owner.current))
|
||||
return 0
|
||||
if(isbrain(owner.current))
|
||||
return 0
|
||||
if(emergency_shuttle.location<2)
|
||||
return 0
|
||||
if(!owner.current || owner.current.stat ==2)
|
||||
return 0
|
||||
var/turf/location = get_turf(owner.current.loc)
|
||||
if(!location)
|
||||
return 0
|
||||
|
||||
check_completion()
|
||||
if(issilicon(owner.current))
|
||||
return 0
|
||||
if(isbrain(owner.current))
|
||||
return 0
|
||||
if(emergency_shuttle.location<2)
|
||||
return 0
|
||||
if(!owner.current || owner.current.stat ==2)
|
||||
return 0
|
||||
var/turf/location = get_turf(owner.current.loc)
|
||||
if(!location)
|
||||
return 0
|
||||
if(istype(location, /turf/simulated/shuttle/floor4)) // Fails traitors if they are in the shuttle brig -- Polymorph
|
||||
return 0
|
||||
|
||||
if(istype(location, /turf/simulated/shuttle/floor4)) // Fails traitors if they are in the shuttle brig -- Polymorph
|
||||
return 0
|
||||
|
||||
var/area/check_area = location.loc
|
||||
if(istype(check_area, /area/shuttle/escape/centcom))
|
||||
return 1
|
||||
if(istype(check_area, /area/shuttle/escape_pod1/centcom))
|
||||
return 1
|
||||
if(istype(check_area, /area/shuttle/escape_pod2/centcom))
|
||||
return 1
|
||||
if(istype(check_area, /area/shuttle/escape_pod3/centcom))
|
||||
return 1
|
||||
if(istype(check_area, /area/shuttle/escape_pod4/centcom))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
var/area/check_area = location.loc
|
||||
if(istype(check_area, /area/shuttle/escape/centcom))
|
||||
return 1
|
||||
if(istype(check_area, /area/shuttle/escape_pod1/centcom))
|
||||
return 1
|
||||
if(istype(check_area, /area/shuttle/escape_pod2/centcom))
|
||||
return 1
|
||||
if(istype(check_area, /area/shuttle/escape_pod3/centcom))
|
||||
return 1
|
||||
if(istype(check_area, /area/shuttle/escape_pod4/centcom))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
datum/objective/survive
|
||||
explanation_text = "Stay alive until the end."
|
||||
dangerrating = 3
|
||||
|
||||
datum/objective/survive/check_completion()
|
||||
if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current))
|
||||
return 0 //Brains no longer win survive objectives. --NEO
|
||||
if(!is_special_character(owner.current)) //This fails borg'd traitors
|
||||
return 0
|
||||
return 1
|
||||
|
||||
check_completion()
|
||||
if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current))
|
||||
return 0 //Brains no longer win survive objectives. --NEO
|
||||
if(!is_special_character(owner.current)) //This fails borg'd traitors
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
datum/objective/nuclear
|
||||
@@ -271,268 +249,170 @@ datum/objective/nuclear
|
||||
|
||||
|
||||
|
||||
var/global/list/possible_items = list()
|
||||
datum/objective/steal
|
||||
var/obj/item/steal_target
|
||||
var/target_name
|
||||
var/datum/objective_item/targetinfo = null //Save the chosen item datum so we can access it later.
|
||||
var/obj/item/steal_target = null //Needed for custom objectives (they're just items, not datums).
|
||||
dangerrating = 5 //Overridden by the individual item's difficulty, but defaults to 5 for custom objectives.
|
||||
|
||||
var/global/possible_items[] = list(
|
||||
"the captain's antique laser gun" = /obj/item/weapon/gun/energy/laser/captain,
|
||||
"a hand teleporter" = /obj/item/weapon/hand_tele,
|
||||
"an RCD" = /obj/item/weapon/rcd,
|
||||
"a jetpack" = /obj/item/weapon/tank/jetpack,
|
||||
"a functional AI" = /obj/item/device/aicard,
|
||||
"a pair of magboots" = /obj/item/clothing/shoes/magboots,
|
||||
"the station blueprints" = /obj/item/blueprints,
|
||||
"28 moles of plasma (full tank)" = /obj/item/weapon/tank,
|
||||
"an unused sample of slime extract" = /obj/item/slime_extract,
|
||||
"a piece of corgi meat" = /obj/item/weapon/reagent_containers/food/snacks/meat/corgi,
|
||||
"the medal of captaincy" = /obj/item/clothing/tie/medal/gold/captain,
|
||||
"the hypospray" = /obj/item/weapon/reagent_containers/hypospray,
|
||||
"the nuclear authentication disk" = /obj/item/weapon/disk/nuclear,
|
||||
"an ablative armor vest" = /obj/item/clothing/suit/armor/laserproof,
|
||||
"the reactive teleport armor" = /obj/item/clothing/suit/armor/reactive,
|
||||
/*
|
||||
Nobody takes these seriously anyways -- Ikki
|
||||
"a captain's jumpsuit" = /obj/item/clothing/under/rank/captain,
|
||||
"a research director's jumpsuit" = /obj/item/clothing/under/rank/research_director,
|
||||
"a chief engineer's jumpsuit" = /obj/item/clothing/under/rank/chief_engineer,
|
||||
"a chief medical officer's jumpsuit" = /obj/item/clothing/under/rank/chief_medical_officer,
|
||||
"a head of security's jumpsuit" = /obj/item/clothing/under/rank/head_of_security,
|
||||
"a head of personnel's jumpsuit" = /obj/item/clothing/under/rank/head_of_personnel,
|
||||
*/
|
||||
)
|
||||
datum/objective/steal/New()
|
||||
..()
|
||||
if(!possible_items.len)//Only need to fill the list when it's needed.
|
||||
init_subtypes(/datum/objective_item/steal,possible_items)
|
||||
|
||||
var/global/possible_items_special[] = list(
|
||||
"the captain's pinpointer" = /obj/item/weapon/pinpointer,
|
||||
"an advanced energy gun" = /obj/item/weapon/gun/energy/gun/nuclear,
|
||||
"a diamond drill" = /obj/item/weapon/pickaxe/diamonddrill,
|
||||
"a bag of holding" = /obj/item/weapon/storage/backpack/holding,
|
||||
"a hyper-capacity cell" = /obj/item/weapon/cell/hyper,
|
||||
"10 diamonds" = /obj/item/stack/sheet/mineral/diamond,
|
||||
"50 gold bars" = /obj/item/stack/sheet/mineral/gold,
|
||||
"25 refined uranium bars" = /obj/item/stack/sheet/mineral/uranium,
|
||||
"a laser pointer" = /obj/item/device/laser_pointer,
|
||||
)
|
||||
datum/objective/steal/find_target()
|
||||
return set_target(pick(possible_items))
|
||||
|
||||
datum/objective/steal/proc/set_target(var/datum/objective_item/item)
|
||||
targetinfo = item
|
||||
|
||||
steal_target = targetinfo.targetitem
|
||||
explanation_text = "Steal [targetinfo.name]."
|
||||
dangerrating = targetinfo.difficulty
|
||||
return steal_target
|
||||
|
||||
datum/objective/steal/proc/select_target() //For admins setting objectives manually.
|
||||
var/list/possible_items_all = possible_items+"custom"
|
||||
var/new_target = input("Select target:", "Objective target", steal_target) as null|anything in possible_items_all
|
||||
if (!new_target) return
|
||||
|
||||
if (new_target == "custom") //Can set custom items.
|
||||
var/obj/item/custom_target = input("Select type:","Type") as null|anything in typesof(/obj/item)
|
||||
if (!custom_target) return
|
||||
var/tmp_obj = new custom_target
|
||||
var/custom_name = tmp_obj:name
|
||||
del(tmp_obj)
|
||||
custom_name = copytext(sanitize(input("Enter target name:", "Objective target", custom_name) as text|null),1,MAX_MESSAGE_LEN)
|
||||
if (!custom_name) return
|
||||
steal_target = custom_target
|
||||
explanation_text = "Steal [custom_name]."
|
||||
|
||||
else
|
||||
set_target(new_target)
|
||||
return steal_target
|
||||
|
||||
datum/objective/steal/check_completion()
|
||||
if(!steal_target || !owner.current) return 0
|
||||
if(!isliving(owner.current)) return 0
|
||||
var/list/all_items = owner.current.GetAllContents() //this should get things in cheesewheels, books, etc.
|
||||
|
||||
for(var/obj/I in all_items) //Check for items
|
||||
if(istype(I, steal_target))
|
||||
if(targetinfo && targetinfo.check_special_completion(I))//Returns 1 by default. Items with special checks will return 1 if the conditions are fulfilled.
|
||||
return 1
|
||||
else //If there's no targetinfo, then that means it was a custom objective. At this point, we know you have the item, so return 1.
|
||||
return 1
|
||||
|
||||
if(targetinfo && I.type in targetinfo.altitems) //Ok, so you don't have the item. Do you have an alternative, at least?
|
||||
if(targetinfo.check_special_completion(I))//Yeah, we do! Don't return 0 if we don't though - then you could fail if you had 1 item that didn't pass and got checked first!
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
proc/set_target(item_name)
|
||||
target_name = item_name
|
||||
steal_target = possible_items[target_name]
|
||||
if (!steal_target )
|
||||
steal_target = possible_items_special[target_name]
|
||||
explanation_text = "Steal [target_name]."
|
||||
return steal_target
|
||||
|
||||
var/global/list/possible_items_special = list()
|
||||
datum/objective/steal/special //ninjas are so special they get their own subtype good for them
|
||||
|
||||
find_target()
|
||||
return set_target(pick(possible_items))
|
||||
datum/objective/steal/special/New()
|
||||
..()
|
||||
if(!possible_items_special.len)
|
||||
init_subtypes(/datum/objective_item/special,possible_items)
|
||||
init_subtypes(/datum/objective_item/stack,possible_items)
|
||||
|
||||
|
||||
proc/select_target()
|
||||
var/list/possible_items_all = possible_items+possible_items_special+"custom"
|
||||
var/new_target = input("Select target:", "Objective target", steal_target) as null|anything in possible_items_all
|
||||
if (!new_target) return
|
||||
if (new_target == "custom")
|
||||
var/obj/item/custom_target = input("Select type:","Type") as null|anything in typesof(/obj/item)
|
||||
if (!custom_target) return
|
||||
var/tmp_obj = new custom_target
|
||||
var/custom_name = tmp_obj:name
|
||||
del(tmp_obj)
|
||||
custom_name = copytext(sanitize(input("Enter target name:", "Objective target", custom_name) as text|null),1,MAX_MESSAGE_LEN)
|
||||
if (!custom_name) return
|
||||
target_name = custom_name
|
||||
steal_target = custom_target
|
||||
explanation_text = "Steal [target_name]."
|
||||
else
|
||||
set_target(new_target)
|
||||
return steal_target
|
||||
|
||||
check_completion()
|
||||
if(!steal_target || !owner.current) return 0
|
||||
if(!isliving(owner.current)) return 0
|
||||
var/list/all_items = owner.current.GetAllContents() //this should get things in cheesewheels, books, etc.
|
||||
switch(target_name)
|
||||
if("28 moles of plasma (full tank)","10 diamonds","50 gold bars","25 refined uranium bars")
|
||||
var/target_amount = text2num(target_name)//Non-numbers are ignored.
|
||||
var/found_amount = 0.0//Always starts as zero.
|
||||
|
||||
for(var/obj/item/I in all_items) //Check for plasma tanks
|
||||
if(istype(I, steal_target))
|
||||
found_amount += (target_name=="28 moles of plasma (full tank)" ? (I:air_contents:toxins) : (I:amount))
|
||||
return found_amount>=target_amount
|
||||
|
||||
if("a functional AI")
|
||||
for(var/obj/item/device/aicard/C in all_items) //Check for ai card
|
||||
for(var/mob/living/silicon/ai/M in C)
|
||||
if(istype(M, /mob/living/silicon/ai) && M.stat != 2) //See if any AI's are alive inside that card.
|
||||
return 1
|
||||
|
||||
if("the station blueprints")
|
||||
for(var/obj/item/I in all_items) //the actual blueprints are good too!
|
||||
if(istype(I, /obj/item/blueprints))
|
||||
return 1
|
||||
if(istype(I, /obj/item/weapon/photo))
|
||||
var/obj/item/weapon/photo/P = I
|
||||
if(P.blueprints) //if the blueprints are in frame
|
||||
return 1
|
||||
|
||||
if("an unused sample of slime extract")
|
||||
for(var/obj/item/slime_extract/E in all_items)
|
||||
if(E.Uses > 0)
|
||||
return 1
|
||||
|
||||
else
|
||||
for(var/obj/I in all_items) //Check for items
|
||||
if(istype(I, steal_target))
|
||||
return 1
|
||||
return 0
|
||||
datum/objective/steal/special/find_target()
|
||||
return set_target(pick(possible_items_special))
|
||||
|
||||
|
||||
|
||||
datum/objective/download
|
||||
proc/gen_amount_goal()
|
||||
target_amount = rand(10,20)
|
||||
explanation_text = "Download [target_amount] research level\s."
|
||||
return target_amount
|
||||
dangerrating = 10
|
||||
|
||||
datum/objective/download/proc/gen_amount_goal()
|
||||
target_amount = rand(10,20)
|
||||
explanation_text = "Download [target_amount] research level\s."
|
||||
return target_amount
|
||||
|
||||
check_completion()
|
||||
if(!ishuman(owner.current))
|
||||
return 0
|
||||
if(!owner.current || owner.current.stat == 2)
|
||||
return 0
|
||||
if(!(istype(owner.current:wear_suit, /obj/item/clothing/suit/space/space_ninja)&&owner.current:wear_suit:s_initialized))
|
||||
return 0
|
||||
var/current_amount
|
||||
var/obj/item/clothing/suit/space/space_ninja/S = owner.current:wear_suit
|
||||
if(!S.stored_research.len)
|
||||
return 0
|
||||
else
|
||||
for(var/datum/tech/current_data in S.stored_research)
|
||||
if(current_data.level>1) current_amount+=(current_data.level-1)
|
||||
if(current_amount<target_amount) return 0
|
||||
return 1
|
||||
datum/objective/download/check_completion()
|
||||
if(!ishuman(owner.current))
|
||||
return 0
|
||||
if(!owner.current || owner.current.stat == 2)
|
||||
return 0
|
||||
if(!(istype(owner.current:wear_suit, /obj/item/clothing/suit/space/space_ninja)&&owner.current:wear_suit:s_initialized))
|
||||
return 0
|
||||
var/current_amount
|
||||
var/obj/item/clothing/suit/space/space_ninja/S = owner.current:wear_suit
|
||||
if(!S.stored_research.len)
|
||||
return 0
|
||||
else
|
||||
for(var/datum/tech/current_data in S.stored_research)
|
||||
if(current_data.level>1) current_amount+=(current_data.level-1)
|
||||
if(current_amount<target_amount) return 0
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
datum/objective/capture
|
||||
proc/gen_amount_goal()
|
||||
dangerrating = 10
|
||||
|
||||
datum/objective/capture/proc/gen_amount_goal()
|
||||
target_amount = rand(5,10)
|
||||
explanation_text = "Accumulate [target_amount] capture point\s. It is better if they remain relatively unharmed."
|
||||
return target_amount
|
||||
|
||||
|
||||
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()
|
||||
for(var/mob/living/carbon/human/M in A)//Humans.
|
||||
if(M.stat==2)//Dead folks are worth less.
|
||||
captured_amount+=0.5
|
||||
continue
|
||||
captured_amount+=1
|
||||
for(var/mob/living/carbon/monkey/M in A)//Monkeys are almost worthless, you failure.
|
||||
captured_amount+=0.1
|
||||
for(var/mob/living/carbon/alien/larva/M in A)//Larva are important for research.
|
||||
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()
|
||||
for(var/mob/living/carbon/human/M in A)//Humans.
|
||||
if(M.stat==2)//Dead folks are worth less.
|
||||
captured_amount+=0.5
|
||||
continue
|
||||
captured_amount+=1
|
||||
for(var/mob/living/carbon/monkey/M in A)//Monkeys are almost worthless, you failure.
|
||||
captured_amount+=0.1
|
||||
for(var/mob/living/carbon/alien/larva/M in A)//Larva are important for research.
|
||||
if(M.stat==2)
|
||||
captured_amount+=0.5
|
||||
continue
|
||||
captured_amount+=1
|
||||
for(var/mob/living/carbon/alien/humanoid/M in A)//Aliens are worth twice as much as humans.
|
||||
if(istype(M, /mob/living/carbon/alien/humanoid/queen))//Queens are worth three times as much as humans.
|
||||
if(M.stat==2)
|
||||
captured_amount+=0.5
|
||||
continue
|
||||
captured_amount+=1.5
|
||||
else
|
||||
captured_amount+=3
|
||||
continue
|
||||
if(M.stat==2)
|
||||
captured_amount+=1
|
||||
for(var/mob/living/carbon/alien/humanoid/M in A)//Aliens are worth twice as much as humans.
|
||||
if(istype(M, /mob/living/carbon/alien/humanoid/queen))//Queens are worth three times as much as humans.
|
||||
if(M.stat==2)
|
||||
captured_amount+=1.5
|
||||
else
|
||||
captured_amount+=3
|
||||
continue
|
||||
if(M.stat==2)
|
||||
captured_amount+=1
|
||||
continue
|
||||
captured_amount+=2
|
||||
if(captured_amount<target_amount)
|
||||
return 0
|
||||
return 1
|
||||
continue
|
||||
captured_amount+=2
|
||||
if(captured_amount<target_amount)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
datum/objective/absorb
|
||||
proc/gen_amount_goal(var/lowbound = 4, var/highbound = 6)
|
||||
target_amount = rand (lowbound,highbound)
|
||||
if (ticker)
|
||||
var/n_p = 1 //autowin
|
||||
if (ticker.current_state == GAME_STATE_SETTING_UP)
|
||||
for(var/mob/new_player/P in player_list)
|
||||
if(P.client && P.ready && P.mind!=owner)
|
||||
n_p ++
|
||||
else if (ticker.current_state == GAME_STATE_PLAYING)
|
||||
for(var/mob/living/carbon/human/P in player_list)
|
||||
if(P.client && !(P.mind in ticker.mode.changelings) && P.mind!=owner)
|
||||
n_p ++
|
||||
target_amount = min(target_amount, n_p)
|
||||
dangerrating = 10
|
||||
|
||||
explanation_text = "Extract [target_amount] compatible genome\s."
|
||||
return target_amount
|
||||
datum/objective/absorb/proc/gen_amount_goal(var/lowbound = 4, var/highbound = 6)
|
||||
target_amount = rand (lowbound,highbound)
|
||||
if (ticker)
|
||||
var/n_p = 1 //autowin
|
||||
if (ticker.current_state == GAME_STATE_SETTING_UP)
|
||||
for(var/mob/new_player/P in player_list)
|
||||
if(P.client && P.ready && P.mind!=owner)
|
||||
n_p ++
|
||||
else if (ticker.current_state == GAME_STATE_PLAYING)
|
||||
for(var/mob/living/carbon/human/P in player_list)
|
||||
if(P.client && !(P.mind in ticker.mode.changelings) && P.mind!=owner)
|
||||
n_p ++
|
||||
target_amount = min(target_amount, n_p)
|
||||
|
||||
check_completion()
|
||||
if(owner && owner.changeling && owner.changeling.absorbed_dna && (owner.changeling.absorbedcount >= target_amount))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
explanation_text = "Extract [target_amount] compatible genome\s."
|
||||
return target_amount
|
||||
|
||||
|
||||
|
||||
/* Isn't suited for global objectives
|
||||
/*---------CULTIST----------*/
|
||||
|
||||
eldergod
|
||||
explanation_text = "Summon Nar-Sie via the use of an appropriate rune. It will only work if nine cultists stand on and around it."
|
||||
|
||||
check_completion()
|
||||
if(eldergod) //global var, defined in rune4.dm
|
||||
return 1
|
||||
return 0
|
||||
|
||||
survivecult
|
||||
var/num_cult
|
||||
|
||||
explanation_text = "Our knowledge must live on. Make sure at least 5 acolytes escape on the shuttle to spread their work on an another station."
|
||||
|
||||
check_completion()
|
||||
if(emergency_shuttle.location<2)
|
||||
return 0
|
||||
|
||||
var/cultists_escaped = 0
|
||||
|
||||
var/area/shuttle/escape/centcom/C = /area/shuttle/escape/centcom
|
||||
for(var/turf/T in get_area_turfs(C.type))
|
||||
for(var/mob/living/carbon/H in T)
|
||||
if(iscultist(H))
|
||||
cultists_escaped++
|
||||
|
||||
if(cultists_escaped>=5)
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
sacrifice //stolen from traitor target objective
|
||||
|
||||
proc/find_target() //I don't know how to make it work with the rune otherwise, so I'll do it via a global var, sacrifice_target, defined in rune15.dm
|
||||
var/list/possible_targets = call(/datum/game_mode/cult/proc/get_unconvertables)()
|
||||
|
||||
if(possible_targets.len > 0)
|
||||
sacrifice_target = pick(possible_targets)
|
||||
|
||||
if(sacrifice_target && sacrifice_target.current)
|
||||
explanation_text = "Sacrifice [sacrifice_target.current.real_name], the [sacrifice_target.assigned_role]. You will need the sacrifice rune (Hell join blood) and three acolytes to do so."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
|
||||
return sacrifice_target
|
||||
|
||||
check_completion() //again, calling on a global list defined in rune15.dm
|
||||
if(sacrifice_target.current in sacrificed)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/*-------ENDOF CULTIST------*/
|
||||
*/
|
||||
datum/objective/absorb/check_completion()
|
||||
if(owner && owner.changeling && owner.changeling.absorbed_dna && (owner.changeling.absorbedcount >= target_amount))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
@@ -0,0 +1,190 @@
|
||||
//Contains the target item datums for Steal objectives.
|
||||
|
||||
datum/objective_item
|
||||
var/name = "A silly bike horn! Honk!"
|
||||
var/targetitem = /obj/item/weapon/bikehorn //typepath of the objective item
|
||||
var/difficulty = 9001 //vaguely how hard it is to do this objective
|
||||
var/list/excludefromjob = list() //If you don't want a job to get a certain objective (no captain stealing his own medal, etcetc)
|
||||
var/list/altitems = list() //Items which can serve as an alternative to the objective (darn you blueprints)
|
||||
|
||||
datum/proc/check_special_completion() //for objectives with special checks (is that slime extract unused? does that intellicard have an ai in it? etcetc)
|
||||
return 1
|
||||
|
||||
|
||||
datum/objective_item/steal/caplaser
|
||||
name = "the captain's antique laser gun"
|
||||
targetitem = /obj/item/weapon/gun/energy/laser/captain
|
||||
difficulty = 5
|
||||
excludefromjob = list("Captain")
|
||||
|
||||
datum/objective_item/steal/handtele
|
||||
name = "a hand teleporter"
|
||||
targetitem = /obj/item/weapon/hand_tele
|
||||
difficulty = 5
|
||||
excludefromjob = list("Captain")
|
||||
|
||||
datum/objective_item/steal/rcd
|
||||
name = "a rapid-construction-device"
|
||||
targetitem = /obj/item/weapon/rcd
|
||||
difficulty = 3
|
||||
|
||||
datum/objective_item/steal/jetpack
|
||||
name = "a jetpack"
|
||||
targetitem = /obj/item/weapon/tank/jetpack
|
||||
difficulty = 3
|
||||
|
||||
datum/objective_item/steal/magboots
|
||||
name = "a pair of magboots"
|
||||
targetitem = /obj/item/clothing/shoes/magboots
|
||||
difficulty = 5
|
||||
excludefromjob = list("Chief Engineer")
|
||||
|
||||
datum/objective_item/steal/corgimeat
|
||||
name = "a piece of corgi meat"
|
||||
targetitem = /obj/item/weapon/reagent_containers/food/snacks/meat/corgi
|
||||
difficulty = 5
|
||||
excludefromjob = list("Head of Personnel") //>hurting your little buddy ever
|
||||
|
||||
datum/objective_item/steal/capmedal
|
||||
name = "the medal of captaincy"
|
||||
targetitem = /obj/item/clothing/tie/medal/gold/captain
|
||||
difficulty = 5
|
||||
excludefromjob = list("Captain")
|
||||
|
||||
datum/objective_item/steal/hypo
|
||||
name = "the hypospray"
|
||||
targetitem = /obj/item/weapon/reagent_containers/hypospray
|
||||
difficulty = 5
|
||||
excludefromjob = list("Chief Medical Officer")
|
||||
|
||||
datum/objective_item/steal/nukedisc
|
||||
name = "the nuclear authentication disk"
|
||||
targetitem = /obj/item/weapon/disk/nuclear
|
||||
difficulty = 5
|
||||
excludefromjob = list("Captain")
|
||||
|
||||
datum/objective_item/steal/ablative
|
||||
name = "an ablative armor vest"
|
||||
targetitem = /obj/item/clothing/suit/armor/laserproof
|
||||
difficulty = 3
|
||||
excludefromjob = list("Head of Security", "Warden")
|
||||
|
||||
datum/objective_item/steal/reactive
|
||||
name = "the reactive teleport armor"
|
||||
targetitem = /obj/item/clothing/suit/armor/reactive
|
||||
difficulty = 5
|
||||
excludefromjob = list("Research Director")
|
||||
|
||||
|
||||
//Items with special checks!
|
||||
datum/objective_item/steal/plasma
|
||||
name = "28 moles of plasma (full tank)"
|
||||
targetitem = /obj/item/weapon/tank
|
||||
difficulty = 3
|
||||
excludefromjob = list("Chief Engineer","Research Director","Station Engineer","Scientist","Atmospheric Technician")
|
||||
|
||||
datum/objective_item/plasma/check_special_completion(var/obj/item/weapon/tank/T)
|
||||
var/target_amount = text2num(name)
|
||||
var/found_amount = 0
|
||||
found_amount += T.air_contents.toxins
|
||||
return found_amount>=target_amount
|
||||
|
||||
|
||||
datum/objective_item/steal/functionalai
|
||||
name = "a functional AI"
|
||||
targetitem = /obj/item/device/aicard
|
||||
difficulty = 20 //beyond the impossible
|
||||
|
||||
datum/objective_item/functionalai/check_special_completion(var/obj/item/device/aicard/C)
|
||||
for(var/mob/living/silicon/ai/A in C)
|
||||
if(istype(A, /mob/living/silicon/ai) && A.stat != 2) //See if any AI's are alive inside that card.
|
||||
return 1
|
||||
return 0
|
||||
|
||||
datum/objective_item/steal/blueprints
|
||||
name = "the station blueprints"
|
||||
targetitem = /obj/item/blueprints
|
||||
difficulty = 10
|
||||
excludefromjob = list("Chief Engineer")
|
||||
altitems = list(/obj/item/weapon/photo)
|
||||
|
||||
datum/objective_item/blueprints/check_special_completion(var/obj/item/I)
|
||||
if(istype(I, /obj/item/blueprints))
|
||||
return 1
|
||||
if(istype(I, /obj/item/weapon/photo))
|
||||
var/obj/item/weapon/photo/P = I
|
||||
if(P.blueprints) //if the blueprints are in frame
|
||||
return 1
|
||||
return 0
|
||||
|
||||
datum/objective_item/steal/slime
|
||||
name = "an unused sample of slime extract"
|
||||
targetitem = /obj/item/slime_extract
|
||||
difficulty = 3
|
||||
excludefromjob = list("Research Director","Scientist")
|
||||
|
||||
datum/objective_item/slime/check_special_completion(var/obj/item/slime_extract/E)
|
||||
if(E.Uses > 0)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
//Old ninja objectives.
|
||||
datum/objective_item/special/pinpointer
|
||||
name = "the captain's pinpointer"
|
||||
targetitem = /obj/item/weapon/pinpointer
|
||||
difficulty = 10
|
||||
|
||||
datum/objective_item/special/aegun
|
||||
name = "an advanced energy gun"
|
||||
targetitem = /obj/item/weapon/gun/energy/gun/nuclear
|
||||
difficulty = 10
|
||||
|
||||
datum/objective_item/special/ddrill
|
||||
name = "a diamond drill"
|
||||
targetitem = /obj/item/weapon/pickaxe/diamonddrill
|
||||
difficulty = 10
|
||||
|
||||
datum/objective_item/special/boh
|
||||
name = "a bag of holding"
|
||||
targetitem = /obj/item/weapon/storage/backpack/holding
|
||||
difficulty = 10
|
||||
|
||||
datum/objective_item/special/hypercell
|
||||
name = "a hyper-capacity cell"
|
||||
targetitem = /obj/item/weapon/cell/hyper
|
||||
difficulty = 5
|
||||
|
||||
datum/objective_item/special/laserpointer
|
||||
name = "a laser pointer"
|
||||
targetitem = /obj/item/device/laser_pointer
|
||||
difficulty = 5
|
||||
|
||||
//Stack objectives get their own subtype
|
||||
datum/objective_item/stack
|
||||
name = "5 cardboards"
|
||||
targetitem = /obj/item/stack/sheet/cardboard
|
||||
difficulty = 9001
|
||||
|
||||
datum/objective_item/stack/check_special_completion(var/obj/item/stack/S)
|
||||
var/target_amount = text2num(name)
|
||||
var/found_amount = 0
|
||||
|
||||
if(istype(S, targetitem))
|
||||
found_amount = S.amount
|
||||
return found_amount>=target_amount
|
||||
|
||||
datum/objective_item/stack/diamond
|
||||
name = "10 diamonds"
|
||||
targetitem = /obj/item/stack/sheet/mineral/diamond
|
||||
difficulty = 10
|
||||
|
||||
datum/objective_item/stack/gold
|
||||
name = "50 gold bars"
|
||||
targetitem = /obj/item/stack/sheet/mineral/gold
|
||||
difficulty = 15
|
||||
|
||||
datum/objective_item/stack/uranium
|
||||
name = "25 refined uranium bars"
|
||||
targetitem = /obj/item/stack/sheet/mineral/uranium
|
||||
difficulty = 10
|
||||
@@ -54,7 +54,7 @@ datum/hSB
|
||||
"Spawn 50 Plasteel" = "hsbplasteel",
|
||||
"Spawn 50 Reinforced Glass" = "hsbrglass",
|
||||
"Spawn 50 Glass" = "hsbglass",
|
||||
"Spawn Full Cable Coil" = "hsbspawn&path=[/obj/item/weapon/cable_coil]",
|
||||
"Spawn Full Cable Coil" = "hsbspawn&path=[/obj/item/stack/cable_coil]",
|
||||
"Spawn Hyper Capacity Power Cell" = "hsbspawn&path=[/obj/item/weapon/cell/hyper]",
|
||||
"Spawn Inf. Capacity Power Cell" = "hsbspawn&path=[/obj/item/weapon/cell/infinite]",
|
||||
"Spawn Rapid Construction Device" = "hsbrcd",
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
throwforce = 10
|
||||
w_class = 3
|
||||
var/charged = 1
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
/obj/effect/rend
|
||||
name = "tear in the fabric of reality"
|
||||
|
||||
@@ -292,7 +292,8 @@
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/red(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/pda/librarian(H), slot_belt)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/barcodescanner(H), slot_l_hand)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/books(H), slot_l_hand)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/barcodescanner(H), slot_r_store)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/laser_pointer(H), slot_l_store)
|
||||
return 1
|
||||
|
||||
|
||||
@@ -57,6 +57,12 @@
|
||||
A.blob_act()
|
||||
del(src)
|
||||
|
||||
/obj/machinery/sleeper/attack_animal(var/mob/living/simple_animal/M)//Stop putting hostile mobs in things guise
|
||||
if(M.environment_smash)
|
||||
visible_message("<span class='danger'>[M.name] smashes [src] apart!</span>")
|
||||
del(src)
|
||||
return
|
||||
|
||||
/obj/machinery/sleeper/attackby(obj/item/I, mob/user)
|
||||
if(!state_open && !occupant)
|
||||
if(default_deconstruction_screwdriver(user, "sleeper-o", "sleeper", I))
|
||||
@@ -227,4 +233,4 @@
|
||||
if(state_open)
|
||||
icon_state = "sleeper-open"
|
||||
else
|
||||
icon_state = "sleeper"
|
||||
icon_state = "sleeper"
|
||||
|
||||
@@ -769,7 +769,7 @@ table tr:first-child th:first-child { border: none;}
|
||||
if(istype(W, /obj/item/weapon/wirecutters) && wires.wires_status == (2 ** wires.wire_count) - 1) //this checks for all wires to be cut, disregard the ammount of wires, binary fuckery with the wires_status
|
||||
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
|
||||
user << "You cut the final wires."
|
||||
var/obj/item/weapon/cable_coil/cable = new /obj/item/weapon/cable_coil( src.loc )
|
||||
var/obj/item/stack/cable_coil/cable = new /obj/item/stack/cable_coil( src.loc )
|
||||
cable.amount = 5
|
||||
buildstage = 1
|
||||
update_icon()
|
||||
@@ -806,8 +806,8 @@ table tr:first-child th:first-child { border: none;}
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/weapon/cable_coil))
|
||||
var/obj/item/weapon/cable_coil/cable = W
|
||||
if(istype(W, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/cable = W
|
||||
if(cable.amount < 5)
|
||||
user << "You need more cable!"
|
||||
return
|
||||
@@ -992,14 +992,14 @@ FIRE ALARM
|
||||
else if (istype(W, /obj/item/weapon/wirecutters))
|
||||
buildstage = 1
|
||||
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
|
||||
var/obj/item/weapon/cable_coil/coil = new /obj/item/weapon/cable_coil()
|
||||
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil()
|
||||
coil.amount = 5
|
||||
coil.loc = user.loc
|
||||
user << "<span class='notice'>You cut the wires from \the [src]</span>"
|
||||
update_icon()
|
||||
if(1)
|
||||
if(istype(W, /obj/item/weapon/cable_coil))
|
||||
var/obj/item/weapon/cable_coil/coil = W
|
||||
if(istype(W, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/coil = W
|
||||
if(coil.amount < 5)
|
||||
user << "<span class='warning'>You need more cable for this!</span>"
|
||||
return
|
||||
|
||||
@@ -35,7 +35,7 @@ obj/machinery/air_sensor
|
||||
var/datum/gas_mixture/air_sample = return_air()
|
||||
|
||||
if(output&1)
|
||||
signal.data["pressure"] = num2text(round(air_sample.return_pressure(),0.1),)
|
||||
signal.data["pressure"] = num2text(round(air_sample.return_pressure(),0.1))
|
||||
if(output&2)
|
||||
signal.data["temperature"] = round(air_sample.temperature,0.1)
|
||||
|
||||
@@ -125,6 +125,8 @@ obj/machinery/computer/general_air_control
|
||||
if(data)
|
||||
if(data["pressure"])
|
||||
sensor_part += " <B>Pressure:</B> [data["pressure"]] kPa<BR>"
|
||||
else
|
||||
sensor_part += " <B>Pressure:</B> No pressure detected<BR>"
|
||||
if(data["temperature"])
|
||||
sensor_part += " <B>Temperature:</B> [data["temperature"]] K<BR>"
|
||||
if(data["oxygen"]||data["toxins"]||data["nitrogen"]||data["carbon_dioxide"])
|
||||
|
||||
@@ -275,7 +275,7 @@ var/global/list/autolathe_recipes_hidden = list( \
|
||||
spawn(16/coeff)
|
||||
use_power(power)
|
||||
spawn(16/coeff)
|
||||
if(template.type == /obj/item/stack)
|
||||
if(istype(template, /obj/item/stack))
|
||||
src.m_amount -= template.m_amt*multiplier
|
||||
src.g_amount -= template.g_amt*multiplier
|
||||
var/obj/new_item = new template.type(T)
|
||||
|
||||
@@ -195,7 +195,7 @@ Auto Patrol: []"},
|
||||
user << "<span class='notice'>Access denied.</span>"
|
||||
else
|
||||
..()
|
||||
if (!istype(W, /obj/item/weapon/screwdriver) && (!src.target))
|
||||
if (!istype(W, /obj/item/weapon/screwdriver) && !istype(W, /obj/item/weapon/weldingtool) && (!src.target)) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
|
||||
if(hasvar(W,"force") && W.force)//If force is defined and non-zero
|
||||
src.target = user
|
||||
if(lasercolor)//To make up for the fact that lasertag bots don't hunt
|
||||
@@ -930,14 +930,26 @@ Auto Patrol: []"},
|
||||
name = "shielded frame assembly"
|
||||
user << "<span class='notice'>You welded the vest to [src].</span>"
|
||||
if(4)
|
||||
if( istype(W, /obj/item/clothing/head/helmet) )
|
||||
user.drop_item()
|
||||
del(W)
|
||||
build_step++
|
||||
user << "<span class='notice'>You add the helmet to [src].</span>"
|
||||
name = "covered and shielded frame assembly"
|
||||
item_state = "[lasercolor]ed209_hat"
|
||||
icon_state = "[lasercolor]ed209_hat"
|
||||
switch(lasercolor)
|
||||
if("b")
|
||||
if( !istype(W, /obj/item/clothing/head/helmet/bluetaghelm) )
|
||||
return
|
||||
|
||||
if("r")
|
||||
if( !istype(W, /obj/item/clothing/head/helmet/redtaghelm) )
|
||||
return
|
||||
|
||||
if("")
|
||||
if( !istype(W, /obj/item/clothing/head/helmet) )
|
||||
return
|
||||
|
||||
user.drop_item()
|
||||
del(W)
|
||||
build_step++
|
||||
user << "<span class='notice'>You add the helmet to [src].</span>"
|
||||
name = "covered and shielded frame assembly"
|
||||
item_state = "[lasercolor]ed209_hat"
|
||||
icon_state = "[lasercolor]ed209_hat"
|
||||
|
||||
if(5)
|
||||
if( isprox(W) )
|
||||
@@ -950,8 +962,8 @@ Auto Patrol: []"},
|
||||
icon_state = "[lasercolor]ed209_prox"
|
||||
|
||||
if(6)
|
||||
if( istype(W, /obj/item/weapon/cable_coil) )
|
||||
var/obj/item/weapon/cable_coil/coil = W
|
||||
if( istype(W, /obj/item/stack/cable_coil) )
|
||||
var/obj/item/stack/cable_coil/coil = W
|
||||
var/turf/T = get_turf(user)
|
||||
user << "<span class='notice'>You start to wire [src]...</span>"
|
||||
sleep(40)
|
||||
|
||||
@@ -135,6 +135,9 @@ var/global/mulebot_count = 0
|
||||
)
|
||||
else
|
||||
user << "\blue [src] does not need a repair!"
|
||||
else if(istype(I, /obj/item/device/multitool) || istype(I, /obj/item/weapon/wirecutters))
|
||||
if(open)
|
||||
attack_hand(usr)
|
||||
else if(load && ismob(load)) // chance to knock off rider
|
||||
if(prob(1+I.force * 2))
|
||||
unload(0)
|
||||
@@ -893,7 +896,7 @@ var/global/mulebot_count = 0
|
||||
new /obj/item/device/assembly/prox_sensor(Tsec)
|
||||
new /obj/item/stack/rods(Tsec)
|
||||
new /obj/item/stack/rods(Tsec)
|
||||
new /obj/item/weapon/cable_coil/cut(Tsec)
|
||||
new /obj/item/stack/cable_coil/cut(Tsec)
|
||||
if (cell)
|
||||
cell.loc = Tsec
|
||||
cell.update_icon()
|
||||
|
||||
@@ -171,7 +171,7 @@ Auto Patrol: []"},
|
||||
user << "\red Access denied."
|
||||
else
|
||||
..()
|
||||
if(!istype(W, /obj/item/weapon/screwdriver) && (W.force) && (!src.target))
|
||||
if(!istype(W, /obj/item/weapon/screwdriver) && !istype(W, /obj/item/weapon/weldingtool) && (W.force) && (!src.target)) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
|
||||
src.target = user
|
||||
src.mode = SECBOT_HUNT
|
||||
|
||||
@@ -219,7 +219,7 @@ Auto Patrol: []"},
|
||||
walk_to(src,0)
|
||||
|
||||
if(target) // make sure target exists
|
||||
if(get_dist(src, src.target) <= 1 && isturf(src.target.loc)) // if right next to perp
|
||||
if(src.Adjacent(target) && isturf(src.target.loc)) // if right next to perp
|
||||
playsound(src.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
|
||||
src.icon_state = "secbot-c"
|
||||
spawn(2)
|
||||
|
||||
@@ -56,8 +56,8 @@
|
||||
|
||||
if(2)
|
||||
// State 2
|
||||
if(istype(W, /obj/item/weapon/cable_coil))
|
||||
var/obj/item/weapon/cable_coil/C = W
|
||||
if(istype(W, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C = W
|
||||
if(C.use(2))
|
||||
user << "You add wires to the assembly."
|
||||
state = 3
|
||||
@@ -110,7 +110,7 @@
|
||||
|
||||
else if(istype(W, /obj/item/weapon/wirecutters))
|
||||
|
||||
new/obj/item/weapon/cable_coil(get_turf(src), 2)
|
||||
new/obj/item/stack/cable_coil(get_turf(src), 2)
|
||||
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
|
||||
user << "You cut the wires from the circuits."
|
||||
state = 2
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
|
||||
component_parts += new /obj/item/weapon/cable_coil(null, 1)
|
||||
component_parts += new /obj/item/weapon/cable_coil(null, 1)
|
||||
component_parts += new /obj/item/stack/cable_coil(null, 1)
|
||||
component_parts += new /obj/item/stack/cable_coil(null, 1)
|
||||
RefreshParts()
|
||||
|
||||
/obj/machinery/clonepod/RefreshParts()
|
||||
|
||||
@@ -261,7 +261,7 @@
|
||||
T.temperature = 5000
|
||||
T.hotspot_expose(50000,50000,1)
|
||||
if(L.name=="Holocarp Spawn")
|
||||
new /mob/living/simple_animal/hostile/carp(L.loc)
|
||||
new /mob/living/simple_animal/hostile/carp/holocarp(L.loc)
|
||||
|
||||
|
||||
/obj/machinery/computer/HolodeckControl/proc/emergencyShutdown()
|
||||
@@ -399,13 +399,13 @@
|
||||
force = 30
|
||||
icon_state = "sword[item_color]"
|
||||
w_class = 4
|
||||
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
|
||||
playsound(user, 'sound/weapons/saberon.ogg', 20, 1)
|
||||
user << "\blue [src] is now active."
|
||||
else
|
||||
force = 3
|
||||
icon_state = "sword0"
|
||||
w_class = 2
|
||||
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
|
||||
playsound(user, 'sound/weapons/saberoff.ogg', 20, 1)
|
||||
user << "\blue [src] can now be concealed."
|
||||
add_fingerprint(user)
|
||||
return
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
user << "<span class='notice'>You unfasten the circuit board.</span>"
|
||||
state = 1
|
||||
icon_state = "1"
|
||||
if(istype(P, /obj/item/weapon/cable_coil))
|
||||
if(istype(P, /obj/item/stack/cable_coil))
|
||||
if(P:amount >= 5)
|
||||
playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
if(do_after(user, 20))
|
||||
@@ -80,7 +80,7 @@
|
||||
user << "<span class='notice'>You remove the cables.</span>"
|
||||
state = 2
|
||||
icon_state = "2"
|
||||
var/obj/item/weapon/cable_coil/A = new /obj/item/weapon/cable_coil( loc )
|
||||
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc )
|
||||
A.amount = 5
|
||||
|
||||
if(istype(P, /obj/item/stack/sheet/rglass))
|
||||
|
||||
@@ -1,125 +1,135 @@
|
||||
/obj/machinery/computer/aifixer
|
||||
name = "\improper AI system integrity restorer"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "ai-fixer"
|
||||
req_access = list(access_captain, access_robotics, access_heads)
|
||||
var/mob/living/silicon/ai/occupier = null
|
||||
var/active = 0
|
||||
circuit = /obj/item/weapon/circuitboard/aifixer
|
||||
|
||||
/obj/machinery/computer/aifixer/New()
|
||||
src.overlays += image('icons/obj/computer.dmi', "ai-fixer-empty")
|
||||
..()
|
||||
|
||||
|
||||
/obj/machinery/computer/aifixer/attackby(I as obj, user as mob)
|
||||
|
||||
if(istype(I, /obj/item/device/aicard))
|
||||
var/obj/item/device/aicard/AIcard = I
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
user << "This terminal isn't functioning right now, get it working!"
|
||||
return
|
||||
AIcard.transfer_ai("AIFIXER","AICARD",src,user)
|
||||
else
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/aifixer/attack_hand(var/mob/user as mob)
|
||||
if(..())
|
||||
return
|
||||
|
||||
user.set_machine(src)
|
||||
var/dat = ""
|
||||
|
||||
if (src.occupier)
|
||||
var/laws
|
||||
dat += "<h3>Stored AI: [src.occupier.name]</h3>"
|
||||
dat += "<b>System integrity:</b> [(src.occupier.health+100)/2]%<br>"
|
||||
|
||||
if (src.occupier.laws.zeroth)
|
||||
laws += "<b>0:</b> [src.occupier.laws.zeroth]<BR>"
|
||||
|
||||
var/number = 1
|
||||
for (var/index = 1, index <= src.occupier.laws.inherent.len, index++)
|
||||
var/law = src.occupier.laws.inherent[index]
|
||||
if (length(law) > 0)
|
||||
laws += "<b>[number]:</b> [law]<BR>"
|
||||
number++
|
||||
|
||||
for (var/index = 1, index <= src.occupier.laws.supplied.len, index++)
|
||||
var/law = src.occupier.laws.supplied[index]
|
||||
if (length(law) > 0)
|
||||
laws += "<b>[number]:</b> [law]<BR>"
|
||||
number++
|
||||
|
||||
dat += "<b>Laws:</b><br>[laws]<br>"
|
||||
|
||||
if (src.occupier.stat == 2)
|
||||
dat += "<span class='bad'>AI non-functional</span>"
|
||||
else
|
||||
dat += "<span class='good'>AI functional</span>"
|
||||
if (!src.active)
|
||||
dat += {"<br><br><A href='byond://?src=\ref[src];fix=1'>Begin Reconstruction</A>"}
|
||||
else
|
||||
dat += "<br><br>Reconstruction in process, please wait.<br>"
|
||||
dat += {"<br><A href='?src=\ref[user];mach_close=computer'>Close</A>"}
|
||||
|
||||
//user << browse(dat, "window=computer;size=400x500")
|
||||
//onclose(user, "computer")
|
||||
var/datum/browser/popup = new(user, "computer", "AI System Integrity Restorer", 400, 500)
|
||||
popup.set_content(dat)
|
||||
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.open()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/aifixer/process()
|
||||
if(..())
|
||||
src.updateDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/aifixer/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
if (href_list["fix"])
|
||||
src.active = 1
|
||||
src.overlays += image('icons/obj/computer.dmi', "ai-fixer-on")
|
||||
while (src.occupier.health < 100)
|
||||
src.occupier.adjustOxyLoss(-1)
|
||||
src.occupier.adjustFireLoss(-1)
|
||||
src.occupier.adjustToxLoss(-1)
|
||||
src.occupier.adjustBruteLoss(-1)
|
||||
src.occupier.updatehealth()
|
||||
if (src.occupier.health >= 0 && src.occupier.stat == 2)
|
||||
src.occupier.stat = 0
|
||||
src.occupier.lying = 0
|
||||
dead_mob_list -= src.occupier
|
||||
living_mob_list += src.occupier
|
||||
src.overlays -= image('icons/obj/computer.dmi', "ai-fixer-404")
|
||||
src.overlays += image('icons/obj/computer.dmi', "ai-fixer-full")
|
||||
src.updateUsrDialog()
|
||||
sleep(10)
|
||||
src.active = 0
|
||||
src.overlays -= image('icons/obj/computer.dmi', "ai-fixer-on")
|
||||
|
||||
|
||||
src.add_fingerprint(usr)
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/computer/aifixer/update_icon()
|
||||
..()
|
||||
// Broken / Unpowered
|
||||
if((stat & BROKEN) || (stat & NOPOWER))
|
||||
overlays.Cut()
|
||||
|
||||
// Working / Powered
|
||||
else
|
||||
if (occupier)
|
||||
switch (occupier.stat)
|
||||
if (0)
|
||||
overlays += image('icons/obj/computer.dmi', "ai-fixer-full")
|
||||
if (2)
|
||||
overlays += image('icons/obj/computer.dmi', "ai-fixer-404")
|
||||
else
|
||||
overlays += image('icons/obj/computer.dmi', "ai-fixer-empty")
|
||||
/obj/machinery/computer/aifixer
|
||||
name = "\improper AI system integrity restorer"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "ai-fixer"
|
||||
req_access = list(access_captain, access_robotics, access_heads)
|
||||
var/mob/living/silicon/ai/occupant = null
|
||||
var/active = 0
|
||||
circuit = /obj/item/weapon/circuitboard/aifixer
|
||||
|
||||
/obj/machinery/computer/aifixer/New()
|
||||
src.overlays += image('icons/obj/computer.dmi', "ai-fixer-empty")
|
||||
..()
|
||||
|
||||
|
||||
/obj/machinery/computer/aifixer/attackby(I as obj, user as mob)
|
||||
if(occupant && istype(I, /obj/item/weapon/screwdriver))
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
user << "<span class='warning'>The screws on [name]'s screen won't budge.</span>"
|
||||
else
|
||||
user << "<span class='warning'>The screws on [name]'s screen won't budge and it emits a warning beep.</span>"
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/device/aicard))
|
||||
var/obj/item/device/aicard/AIcard = I
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
if(occupant)
|
||||
AIcard.transfer_ai("AIFIXER","AICARD",src,user)
|
||||
overlays.Cut()
|
||||
return
|
||||
user << "This terminal isn't functioning right now, get it working!"
|
||||
return
|
||||
AIcard.transfer_ai("AIFIXER","AICARD",src,user)
|
||||
else
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/aifixer/attack_hand(var/mob/user as mob)
|
||||
if(..())
|
||||
return
|
||||
|
||||
user.set_machine(src)
|
||||
var/dat = ""
|
||||
|
||||
if (src.occupant)
|
||||
var/laws
|
||||
dat += "<h3>Stored AI: [src.occupant.name]</h3>"
|
||||
dat += "<b>System integrity:</b> [(src.occupant.health+100)/2]%<br>"
|
||||
|
||||
if (src.occupant.laws.zeroth)
|
||||
laws += "<b>0:</b> [src.occupant.laws.zeroth]<BR>"
|
||||
|
||||
var/number = 1
|
||||
for (var/index = 1, index <= src.occupant.laws.inherent.len, index++)
|
||||
var/law = src.occupant.laws.inherent[index]
|
||||
if (length(law) > 0)
|
||||
laws += "<b>[number]:</b> [law]<BR>"
|
||||
number++
|
||||
|
||||
for (var/index = 1, index <= src.occupant.laws.supplied.len, index++)
|
||||
var/law = src.occupant.laws.supplied[index]
|
||||
if (length(law) > 0)
|
||||
laws += "<b>[number]:</b> [law]<BR>"
|
||||
number++
|
||||
|
||||
dat += "<b>Laws:</b><br>[laws]<br>"
|
||||
|
||||
if (src.occupant.stat == 2)
|
||||
dat += "<span class='bad'>AI non-functional</span>"
|
||||
else
|
||||
dat += "<span class='good'>AI functional</span>"
|
||||
if (!src.active)
|
||||
dat += {"<br><br><A href='byond://?src=\ref[src];fix=1'>Begin Reconstruction</A>"}
|
||||
else
|
||||
dat += "<br><br>Reconstruction in process, please wait.<br>"
|
||||
dat += {"<br><A href='?src=\ref[user];mach_close=computer'>Close</A>"}
|
||||
|
||||
//user << browse(dat, "window=computer;size=400x500")
|
||||
//onclose(user, "computer")
|
||||
var/datum/browser/popup = new(user, "computer", "AI System Integrity Restorer", 400, 500)
|
||||
popup.set_content(dat)
|
||||
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.open()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/aifixer/process()
|
||||
if(..())
|
||||
src.updateDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/aifixer/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
if (href_list["fix"])
|
||||
src.active = 1
|
||||
src.overlays += image('icons/obj/computer.dmi', "ai-fixer-on")
|
||||
while (src.occupant.health < 100)
|
||||
src.occupant.adjustOxyLoss(-1)
|
||||
src.occupant.adjustFireLoss(-1)
|
||||
src.occupant.adjustToxLoss(-1)
|
||||
src.occupant.adjustBruteLoss(-1)
|
||||
src.occupant.updatehealth()
|
||||
if (src.occupant.health >= 0 && src.occupant.stat == 2)
|
||||
src.occupant.stat = 0
|
||||
src.occupant.lying = 0
|
||||
dead_mob_list -= src.occupant
|
||||
living_mob_list += src.occupant
|
||||
src.overlays -= image('icons/obj/computer.dmi', "ai-fixer-404")
|
||||
src.overlays += image('icons/obj/computer.dmi', "ai-fixer-full")
|
||||
src.updateUsrDialog()
|
||||
sleep(10)
|
||||
src.active = 0
|
||||
src.overlays -= image('icons/obj/computer.dmi', "ai-fixer-on")
|
||||
|
||||
|
||||
src.add_fingerprint(usr)
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/computer/aifixer/update_icon()
|
||||
..()
|
||||
// Broken / Unpowered
|
||||
if((stat & BROKEN) || (stat & NOPOWER))
|
||||
overlays.Cut()
|
||||
|
||||
// Working / Powered
|
||||
else
|
||||
if (occupant)
|
||||
switch (occupant.stat)
|
||||
if (0)
|
||||
overlays += image('icons/obj/computer.dmi', "ai-fixer-full")
|
||||
if (2)
|
||||
overlays += image('icons/obj/computer.dmi', "ai-fixer-404")
|
||||
else
|
||||
overlays += image('icons/obj/computer.dmi', "ai-fixer-empty")
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
/obj/item/toy/prize/mauler = 1,
|
||||
/obj/item/toy/prize/odysseus = 1,
|
||||
/obj/item/toy/prize/phazon = 1,
|
||||
/obj/item/toy/cards = 2,
|
||||
/obj/item/toy/cards/deck = 2,
|
||||
/obj/item/toy/nuke = 2
|
||||
)
|
||||
|
||||
|
||||
@@ -330,8 +330,8 @@
|
||||
user << "<span class='notice'>You unfasten the circuit board.</span>"
|
||||
src.state = 1
|
||||
src.icon_state = "1"
|
||||
if(istype(P, /obj/item/weapon/cable_coil))
|
||||
var/obj/item/weapon/cable_coil/C = P
|
||||
if(istype(P, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C = P
|
||||
if(C.amount >= 5)
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
if(do_after(user, 20))
|
||||
@@ -347,7 +347,7 @@
|
||||
user << "<span class='notice'>You remove the cables.</span>"
|
||||
src.state = 2
|
||||
src.icon_state = "2"
|
||||
var/obj/item/weapon/cable_coil/A = new (loc)
|
||||
var/obj/item/stack/cable_coil/A = new (loc)
|
||||
A.amount = 5
|
||||
A.add_fingerprint(user)
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
var/mapping = 0//For the overview file, interesting bit of code.
|
||||
|
||||
check_eye(var/mob/user as mob)
|
||||
if ((get_dist(user, src) > 1 || !( user.canmove ) || user.blinded || !( current ) || !( current.status )) && (!istype(user, /mob/living/silicon)))
|
||||
if ((get_dist(user, src) > 1 || user.blinded || !( current ) || !( current.status )) && (!istype(user, /mob/living/silicon)))
|
||||
return null
|
||||
var/list/viewing = viewers(src)
|
||||
if((istype(user,/mob/living/silicon/robot)) && (!(viewing.Find(user))))
|
||||
@@ -20,67 +20,68 @@
|
||||
|
||||
|
||||
attack_hand(var/mob/user as mob)
|
||||
if (src.z > 6)
|
||||
user << "\red <b>Unable to establish a connection</b>: \black You're too far away from the station!"
|
||||
return
|
||||
if(!stat)
|
||||
if (src.z > 6)
|
||||
user << "\red <b>Unable to establish a connection</b>: \black You're too far away from the station!"
|
||||
return
|
||||
|
||||
if (!network)
|
||||
world.log << "A computer lacks a network at [x],[y],[z]."
|
||||
return
|
||||
if (!(istype(network,/list)))
|
||||
world.log << "The computer at [x],[y],[z] has a network that is not a list!"
|
||||
return
|
||||
if (!network)
|
||||
world.log << "A computer lacks a network at [x],[y],[z]."
|
||||
return
|
||||
if (!(istype(network,/list)))
|
||||
world.log << "The computer at [x],[y],[z] has a network that is not a list!"
|
||||
return
|
||||
|
||||
if(..())
|
||||
return
|
||||
if(..())
|
||||
return
|
||||
|
||||
var/list/L = list()
|
||||
for (var/obj/machinery/camera/C in cameranet.cameras)
|
||||
L.Add(C)
|
||||
var/list/L = list()
|
||||
for (var/obj/machinery/camera/C in cameranet.cameras)
|
||||
L.Add(C)
|
||||
|
||||
camera_sort(L)
|
||||
camera_sort(L)
|
||||
|
||||
var/list/D = list()
|
||||
D["Cancel"] = "Cancel"
|
||||
for(var/obj/machinery/camera/C in L)
|
||||
if(!C.network)
|
||||
world.log << "[C.c_tag] has no camera network."
|
||||
continue
|
||||
if(!(istype(C.network,/list)))
|
||||
world.log << "[C.c_tag]'s camera network is not a list!"
|
||||
continue
|
||||
var/list/tempnetwork = C.network&network
|
||||
if(tempnetwork.len)
|
||||
D[text("[][]", C.c_tag, (C.status ? null : " (Deactivated)"))] = C
|
||||
var/list/D = list()
|
||||
D["Cancel"] = "Cancel"
|
||||
for(var/obj/machinery/camera/C in L)
|
||||
if(!C.network)
|
||||
world.log << "[C.c_tag] has no camera network."
|
||||
continue
|
||||
if(!(istype(C.network,/list)))
|
||||
world.log << "[C.c_tag]'s camera network is not a list!"
|
||||
continue
|
||||
var/list/tempnetwork = C.network&network
|
||||
if(tempnetwork.len)
|
||||
D[text("[][]", C.c_tag, (C.status ? null : " (Deactivated)"))] = C
|
||||
|
||||
var/t = input(user, "Which camera should you change to?") as null|anything in D
|
||||
if(!t)
|
||||
user.unset_machine()
|
||||
return 0
|
||||
|
||||
var/obj/machinery/camera/C = D[t]
|
||||
|
||||
if(t == "Cancel")
|
||||
user.unset_machine()
|
||||
return 0
|
||||
|
||||
if(C)
|
||||
if ((get_dist(user, src) > 1 || user.machine != src || user.blinded || !( user.canmove ) || !( C.can_use() )) && (!istype(user, /mob/living/silicon/ai)))
|
||||
if(!C.can_use() && !isAI(user))
|
||||
src.current = null
|
||||
var/t = input(user, "Which camera should you change to?") as null|anything in D
|
||||
if(!t)
|
||||
user.unset_machine()
|
||||
return 0
|
||||
else
|
||||
if(isAI(user))
|
||||
var/mob/living/silicon/ai/A = user
|
||||
A.eyeobj.setLoc(get_turf(C))
|
||||
A.client.eye = A.eyeobj
|
||||
else
|
||||
src.current = C
|
||||
use_power(50)
|
||||
|
||||
spawn(5)
|
||||
attack_hand(user)
|
||||
return
|
||||
var/obj/machinery/camera/C = D[t]
|
||||
|
||||
if(t == "Cancel")
|
||||
user.unset_machine()
|
||||
return 0
|
||||
|
||||
if(C)
|
||||
if ((get_dist(user, src) > 1 || user.machine != src || user.blinded || !( C.can_use() )) && (!istype(user, /mob/living/silicon/ai)))
|
||||
if(!C.can_use() && !isAI(user))
|
||||
src.current = null
|
||||
return 0
|
||||
else
|
||||
if(isAI(user))
|
||||
var/mob/living/silicon/ai/A = user
|
||||
A.eyeobj.setLoc(get_turf(C))
|
||||
A.client.eye = A.eyeobj
|
||||
else
|
||||
src.current = C
|
||||
use_power(50)
|
||||
|
||||
spawn(5)
|
||||
attack_hand(user)
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -101,8 +102,8 @@
|
||||
|
||||
/obj/machinery/computer/security/telescreen/entertainment
|
||||
name = "entertainment monitor"
|
||||
desc = "Damn, they better have /tg/thechannel on these things."
|
||||
icon = 'icons/obj/status_display.dmi'
|
||||
desc = "Damn, they better have the /tg/ channel on these things."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "entertainment"
|
||||
network = list("thunder")
|
||||
density = 0
|
||||
|
||||
@@ -53,8 +53,8 @@
|
||||
return
|
||||
switch(state)
|
||||
if(1)
|
||||
if(istype(P, /obj/item/weapon/cable_coil))
|
||||
var/obj/item/weapon/cable_coil/C = P
|
||||
if(istype(P, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C = P
|
||||
if(C.amount >= 5)
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
user << "<span class='notice'>You start to add cables to the frame.</span>"
|
||||
@@ -92,7 +92,7 @@
|
||||
user << "<span class='notice'>You remove the cables.</span>"
|
||||
state = 1
|
||||
icon_state = "box_0"
|
||||
var/obj/item/weapon/cable_coil/A = new /obj/item/weapon/cable_coil( src.loc )
|
||||
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc )
|
||||
A.amount = 5
|
||||
|
||||
if(3)
|
||||
@@ -136,9 +136,9 @@
|
||||
for(var/I in req_components)
|
||||
if(istype(P, text2path(I)) && (req_components[I] > 0))
|
||||
success=1
|
||||
if(istype(P, /obj/item/weapon/cable_coil))
|
||||
var/obj/item/weapon/cable_coil/CP = P
|
||||
var/obj/item/weapon/cable_coil/CC = new /obj/item/weapon/cable_coil(src, 1, CP.item_color)
|
||||
if(istype(P, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/CP = P
|
||||
var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src, 1, CP.item_color)
|
||||
if(CP.use(1))
|
||||
components += CC
|
||||
req_components[I]--
|
||||
@@ -386,7 +386,7 @@ to destroy them and players will be able to make replacements.
|
||||
req_components = list(
|
||||
"/obj/item/weapon/stock_parts/matter_bin" = 1,
|
||||
"/obj/item/weapon/stock_parts/micro_laser" = 1,
|
||||
"/obj/item/weapon/cable_coil" = 2,
|
||||
"/obj/item/stack/cable_coil" = 2,
|
||||
"/obj/item/weapon/stock_parts/capacitor" = 1)
|
||||
|
||||
/obj/item/weapon/circuitboard/pacman/super
|
||||
@@ -405,7 +405,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
board_type = "machine"
|
||||
origin_tech = "programming=3"
|
||||
req_components = list(
|
||||
"/obj/item/weapon/cable_coil" = 2,
|
||||
"/obj/item/stack/cable_coil" = 2,
|
||||
"/obj/item/weapon/stock_parts/scanning_module" = 1)
|
||||
|
||||
/obj/item/weapon/circuitboard/mechfab
|
||||
@@ -425,7 +425,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
board_type = "machine"
|
||||
origin_tech = "programming=3;biotech=3"
|
||||
req_components = list(
|
||||
"/obj/item/weapon/cable_coil" = 2,
|
||||
"/obj/item/stack/cable_coil" = 2,
|
||||
"/obj/item/weapon/stock_parts/scanning_module" = 2,
|
||||
"/obj/item/weapon/stock_parts/manipulator" = 2,
|
||||
"/obj/item/weapon/stock_parts/console_screen" = 1)
|
||||
@@ -440,7 +440,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
"/obj/item/weapon/stock_parts/manipulator" = 1,
|
||||
"/obj/item/weapon/stock_parts/micro_laser" = 1,
|
||||
"/obj/item/weapon/stock_parts/console_screen" = 1,
|
||||
"/obj/item/weapon/cable_coil" = 2,)
|
||||
"/obj/item/stack/cable_coil" = 2,)
|
||||
|
||||
/obj/item/weapon/circuitboard/cyborgrecharger
|
||||
name = "circuit board (Cyborg Recharger)"
|
||||
@@ -472,7 +472,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
origin_tech = "programming=2;engineering=2"
|
||||
req_components = list(
|
||||
"/obj/item/weapon/stock_parts/manipulator" = 2,
|
||||
"/obj/item/weapon/cable_coil" = 2,
|
||||
"/obj/item/stack/cable_coil" = 2,
|
||||
"/obj/item/weapon/stock_parts/subspace/filter" = 2)
|
||||
|
||||
/obj/item/weapon/circuitboard/telecomms/relay
|
||||
@@ -482,7 +482,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
origin_tech = "programming=2;engineering=2;bluespace=2"
|
||||
req_components = list(
|
||||
"/obj/item/weapon/stock_parts/manipulator" = 2,
|
||||
"/obj/item/weapon/cable_coil" = 2,
|
||||
"/obj/item/stack/cable_coil" = 2,
|
||||
"/obj/item/weapon/stock_parts/subspace/filter" = 2)
|
||||
|
||||
/obj/item/weapon/circuitboard/telecomms/bus
|
||||
@@ -492,7 +492,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
origin_tech = "programming=2;engineering=2"
|
||||
req_components = list(
|
||||
"/obj/item/weapon/stock_parts/manipulator" = 2,
|
||||
"/obj/item/weapon/cable_coil" = 1,
|
||||
"/obj/item/stack/cable_coil" = 1,
|
||||
"/obj/item/weapon/stock_parts/subspace/filter" = 1)
|
||||
|
||||
/obj/item/weapon/circuitboard/telecomms/processor
|
||||
@@ -505,7 +505,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
"/obj/item/weapon/stock_parts/subspace/filter" = 1,
|
||||
"/obj/item/weapon/stock_parts/subspace/treatment" = 2,
|
||||
"/obj/item/weapon/stock_parts/subspace/analyzer" = 1,
|
||||
"/obj/item/weapon/cable_coil" = 2,
|
||||
"/obj/item/stack/cable_coil" = 2,
|
||||
"/obj/item/weapon/stock_parts/subspace/amplifier" = 1)
|
||||
|
||||
/obj/item/weapon/circuitboard/telecomms/server
|
||||
@@ -515,7 +515,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
origin_tech = "programming=2;engineering=2"
|
||||
req_components = list(
|
||||
"/obj/item/weapon/stock_parts/manipulator" = 2,
|
||||
"/obj/item/weapon/cable_coil" = 1,
|
||||
"/obj/item/stack/cable_coil" = 1,
|
||||
"/obj/item/weapon/stock_parts/subspace/filter" = 1)
|
||||
|
||||
/obj/item/weapon/circuitboard/telecomms/broadcaster
|
||||
@@ -525,7 +525,7 @@ obj/item/weapon/circuitboard/rdserver
|
||||
origin_tech = "programming=2;engineering=2;bluespace=1"
|
||||
req_components = list(
|
||||
"/obj/item/weapon/stock_parts/manipulator" = 2,
|
||||
"/obj/item/weapon/cable_coil" = 1,
|
||||
"/obj/item/stack/cable_coil" = 1,
|
||||
"/obj/item/weapon/stock_parts/subspace/filter" = 1,
|
||||
"/obj/item/weapon/stock_parts/subspace/crystal" = 1,
|
||||
"/obj/item/weapon/stock_parts/micro_laser/high" = 2)
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
src.health = max(0, src.health - damage)
|
||||
if (src.health <= 0)
|
||||
new /obj/item/weapon/shard(src.loc)
|
||||
var/obj/item/weapon/cable_coil/CC = new /obj/item/weapon/cable_coil(src.loc)
|
||||
var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src.loc)
|
||||
CC.amount = 2
|
||||
src.density = 0
|
||||
del(src)
|
||||
@@ -137,7 +137,7 @@
|
||||
/obj/machinery/door/window/hitby(AM as mob|obj)
|
||||
|
||||
..()
|
||||
visible_message("\red <B>The glass door was hit by [AM].</B>")
|
||||
visible_message("<span class='danger'>\The [src] was hit by \the [AM].</span>")
|
||||
var/tforce = 0
|
||||
if(ismob(AM))
|
||||
tforce = 40
|
||||
@@ -161,7 +161,7 @@
|
||||
visible_message("\red <B>[user] smashes against the [src.name].</B>")
|
||||
if (src.health <= 0)
|
||||
new /obj/item/weapon/shard(src.loc)
|
||||
var/obj/item/weapon/cable_coil/CC = new /obj/item/weapon/cable_coil(src.loc)
|
||||
var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src.loc)
|
||||
CC.amount = 2
|
||||
src.density = 0
|
||||
del(src)
|
||||
@@ -199,10 +199,10 @@
|
||||
if(I.damtype == BRUTE || I.damtype == BURN)
|
||||
src.health = max(0, src.health - aforce)
|
||||
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
|
||||
visible_message("\red <B>[src] was hit by [I].</B>")
|
||||
visible_message("<span class='danger'>\The [src] has been hit by [user] with [I].</span>")
|
||||
if (src.health <= 0)
|
||||
new /obj/item/weapon/shard(src.loc)
|
||||
var/obj/item/weapon/cable_coil/CC = new /obj/item/weapon/cable_coil(src.loc)
|
||||
var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src.loc)
|
||||
CC.amount = 2
|
||||
src.density = 0
|
||||
del(src)
|
||||
|
||||
@@ -268,6 +268,10 @@ Class Procs:
|
||||
user.set_machine(src)
|
||||
return 0
|
||||
|
||||
/obj/machinery/CheckParts()
|
||||
RefreshParts()
|
||||
return
|
||||
|
||||
/obj/machinery/proc/RefreshParts() //Placeholder proc for machines that are built using frames.
|
||||
return
|
||||
|
||||
@@ -317,4 +321,4 @@ Class Procs:
|
||||
anchored = !anchored
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
return 1
|
||||
return 0
|
||||
return 0
|
||||
|
||||
+1028
-1028
File diff suppressed because it is too large
Load Diff
@@ -60,12 +60,15 @@
|
||||
|
||||
cover = new /obj/machinery/porta_turret_cover(loc)
|
||||
cover.Parent_Turret = src
|
||||
setup()
|
||||
|
||||
/obj/machinery/porta_turret/proc/setup()
|
||||
if(!installation) //if for some reason the turret has no gun (ie, admin spawned) it resorts to basic taser shots
|
||||
projectile = /obj/item/projectile/energy/electrode //holder for the projectile, here it is being set
|
||||
eprojectile = /obj/item/projectile/beam //holder for the projectile when emagged, if it is different
|
||||
sound = 1
|
||||
else
|
||||
sound = null
|
||||
var/obj/item/weapon/gun/energy/E=new installation //All energy-based weapons are applicable
|
||||
var/obj/item/ammo_casing/shottype = E.ammo_type[1]
|
||||
projectile = shottype.projectile_type
|
||||
@@ -73,7 +76,7 @@
|
||||
|
||||
switch(E.type)
|
||||
if(/obj/item/weapon/gun/energy/laser/bluetag)
|
||||
eprojectile = /obj/item/projectile/omnitag //This bolt will stun ERRYONE with a vest
|
||||
eprojectile = /obj/item/projectile/bluetag
|
||||
lasercolor = "b"
|
||||
req_access = list(access_maint_tunnels, access_theatre)
|
||||
check_records = 0
|
||||
@@ -84,7 +87,7 @@
|
||||
shot_delay = 30
|
||||
|
||||
if(/obj/item/weapon/gun/energy/laser/redtag)
|
||||
eprojectile = /obj/item/projectile/omnitag
|
||||
eprojectile = /obj/item/projectile/redtag
|
||||
lasercolor = "r"
|
||||
req_access = list(access_maint_tunnels, access_theatre)
|
||||
check_records = 0
|
||||
@@ -768,6 +771,7 @@
|
||||
Turret.name = finish_name
|
||||
Turret.installation = installation
|
||||
Turret.gun_charge = gun_charge
|
||||
Turret.setup()
|
||||
|
||||
// Turret.cover=new/obj/machinery/porta_turret_cover(loc)
|
||||
// Turret.cover.Parent_Turret=Turret
|
||||
@@ -998,4 +1002,4 @@ Status: []<BR>"},
|
||||
|
||||
New()
|
||||
installation = new/obj/item/weapon/gun/energy/laser(loc)
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
if(istype(charging, /obj/item/weapon/melee/baton))
|
||||
var/obj/item/weapon/melee/baton/B = charging
|
||||
if(B.bcell)
|
||||
if(B.bcell.give(175))
|
||||
if(B.bcell.give(1500)) //Because otherwise it takes two minutes to fully charge due to 15k cells. - Neerti
|
||||
icon_state = "recharger1"
|
||||
use_power(200)
|
||||
else
|
||||
|
||||
@@ -139,12 +139,12 @@
|
||||
user << "You remove the cables."
|
||||
icon_state = "borgdecon3"
|
||||
construct_op ++
|
||||
var/obj/item/weapon/cable_coil/A = new /obj/item/weapon/cable_coil( user.loc )
|
||||
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( user.loc )
|
||||
A.amount = 5
|
||||
stat |= BROKEN // the machine's been borked!
|
||||
if(3)
|
||||
if(istype(P, /obj/item/weapon/cable_coil))
|
||||
var/obj/item/weapon/cable_coil/A = P
|
||||
if(istype(P, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/A = P
|
||||
if(A.amount >= 5)
|
||||
user << "You insert the cables."
|
||||
A.amount -= 5
|
||||
@@ -177,8 +177,8 @@
|
||||
newpath = text2path(I)
|
||||
var/obj/item/s = new newpath
|
||||
s.loc = user.loc
|
||||
if(istype(P, /obj/item/weapon/cable_coil))
|
||||
var/obj/item/weapon/cable_coil/A = P
|
||||
if(istype(P, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/A = P
|
||||
A.amount = 1
|
||||
|
||||
// Drop a circuit board too
|
||||
@@ -266,7 +266,7 @@
|
||||
var/coeff = recharge_speed / 200
|
||||
for(var/obj/O in um)
|
||||
// Engineering
|
||||
if(istype(O,/obj/item/stack/sheet/metal) || istype(O,/obj/item/stack/sheet/rglass) || istype(O,/obj/item/stack/rods) || istype(O,/obj/item/weapon/cable_coil)|| istype(O,/obj/item/stack/tile/plasteel))
|
||||
if(istype(O,/obj/item/stack/sheet/metal) || istype(O,/obj/item/stack/sheet/rglass) || istype(O,/obj/item/stack/rods) || istype(O,/obj/item/stack/cable_coil)|| istype(O,/obj/item/stack/tile/plasteel))
|
||||
if(O:amount < 50)
|
||||
O:amount += coeff
|
||||
// Security
|
||||
|
||||
@@ -265,8 +265,8 @@
|
||||
user << "\blue You open the panel and expose the wiring."
|
||||
is_open = 1
|
||||
|
||||
else if(istype(W, /obj/item/weapon/cable_coil) && malfunction && is_open)
|
||||
var/obj/item/weapon/cable_coil/coil = W
|
||||
else if(istype(W, /obj/item/stack/cable_coil) && malfunction && is_open)
|
||||
var/obj/item/stack/cable_coil/coil = W
|
||||
user << "\blue You begin to replace the wires."
|
||||
//if(do_after(user, min(60, round( ((maxhealth/health)*10)+(malfunction*10) ))) //Take longer to repair heavier damage
|
||||
if(do_after(user, 30))
|
||||
|
||||
@@ -232,6 +232,8 @@
|
||||
origin_tech = null
|
||||
|
||||
/obj/item/weapon/bombcore/badmin/defuse() //because we wouldn't want them being harvested by players
|
||||
var/obj/machinery/syndicatebomb/B = src.loc
|
||||
del(B)
|
||||
del(src)
|
||||
|
||||
/obj/item/weapon/bombcore/badmin/summon/
|
||||
@@ -239,13 +241,14 @@
|
||||
var/amt_summon = 1
|
||||
|
||||
/obj/item/weapon/bombcore/badmin/summon/detonate()
|
||||
var/obj/machinery/syndicatebomb/B = src.loc
|
||||
for(var/i = 0; i < amt_summon; i++)
|
||||
var/atom/movable/X = new summon_path
|
||||
X.loc = get_turf(src)
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(X, pick(NORTH,SOUTH,EAST,WEST))
|
||||
|
||||
del(B)
|
||||
del(src)
|
||||
|
||||
/obj/item/weapon/bombcore/badmin/summon/clown
|
||||
|
||||
@@ -45,12 +45,12 @@
|
||||
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
|
||||
user << "<span class='notice'>You remove the cables.</span>"
|
||||
construct_op ++
|
||||
var/obj/item/weapon/cable_coil/A = new /obj/item/weapon/cable_coil( user.loc )
|
||||
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( user.loc )
|
||||
A.amount = 5
|
||||
stat |= BROKEN // the machine's been borked!
|
||||
if(3)
|
||||
if(istype(P, /obj/item/weapon/cable_coil))
|
||||
var/obj/item/weapon/cable_coil/A = P
|
||||
if(istype(P, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/A = P
|
||||
if(A.use(5))
|
||||
user << "<span class='notice'>You insert the cables.</span>"
|
||||
construct_op --
|
||||
@@ -81,8 +81,8 @@
|
||||
newpath = text2path(I)
|
||||
var/obj/item/s = new newpath
|
||||
s.loc = src.loc
|
||||
if(istype(s, /obj/item/weapon/cable_coil))
|
||||
var/obj/item/weapon/cable_coil/A = s
|
||||
if(istype(s, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/A = s
|
||||
A.amount = 1
|
||||
A.update_icon()
|
||||
|
||||
|
||||
@@ -715,7 +715,7 @@
|
||||
icon_state = "tool"
|
||||
icon_deny = "tool-deny"
|
||||
//req_access_txt = "12" //Maintenance access
|
||||
products = list(/obj/item/weapon/cable_coil/random = 10,/obj/item/weapon/crowbar = 5,/obj/item/weapon/weldingtool = 3,/obj/item/weapon/wirecutters = 5,
|
||||
products = list(/obj/item/stack/cable_coil/random = 10,/obj/item/weapon/crowbar = 5,/obj/item/weapon/weldingtool = 3,/obj/item/weapon/wirecutters = 5,
|
||||
/obj/item/weapon/wrench = 5,/obj/item/device/analyzer = 5,/obj/item/device/t_scanner = 5,/obj/item/weapon/screwdriver = 5)
|
||||
contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,/obj/item/clothing/gloves/fyellow = 2)
|
||||
premium = list(/obj/item/clothing/gloves/yellow = 1)
|
||||
@@ -754,7 +754,7 @@
|
||||
icon_state = "robotics"
|
||||
icon_deny = "robotics-deny"
|
||||
req_access_txt = "29"
|
||||
products = list(/obj/item/clothing/suit/labcoat = 4,/obj/item/clothing/under/rank/roboticist = 4,/obj/item/weapon/cable_coil = 4,/obj/item/device/flash = 4,
|
||||
products = list(/obj/item/clothing/suit/labcoat = 4,/obj/item/clothing/under/rank/roboticist = 4,/obj/item/stack/cable_coil = 4,/obj/item/device/flash = 4,
|
||||
/obj/item/weapon/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3,
|
||||
/obj/item/weapon/scalpel = 2,/obj/item/weapon/circular_saw = 2,/obj/item/weapon/tank/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5,
|
||||
/obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5)
|
||||
|
||||
@@ -62,9 +62,9 @@
|
||||
ticker.mode.traitors += user.mind
|
||||
user.mind.special_role = "Avatar of the Wish Granter"
|
||||
|
||||
var/datum/objective/silence/silence = new
|
||||
silence.owner = user.mind
|
||||
user.mind.objectives += silence
|
||||
var/datum/objective/hijack/hijack = new
|
||||
hijack.owner = user.mind
|
||||
user.mind.objectives += hijack
|
||||
|
||||
var/obj_count = 1
|
||||
for(var/datum/objective/OBJ in user.mind.objectives)
|
||||
|
||||
@@ -247,7 +247,7 @@
|
||||
var/datum/event/event
|
||||
var/turf/old_turf
|
||||
var/obj/structure/cable/last_piece
|
||||
var/obj/item/weapon/cable_coil/cable
|
||||
var/obj/item/stack/cable_coil/cable
|
||||
var/max_cable = 1000
|
||||
|
||||
New()
|
||||
@@ -274,7 +274,7 @@
|
||||
chassis.events.clearEvent("onMove",event)
|
||||
return ..()
|
||||
|
||||
action(var/obj/item/weapon/cable_coil/target)
|
||||
action(var/obj/item/stack/cable_coil/target)
|
||||
if(!action_checks(target))
|
||||
return
|
||||
var/result = load_cable(target)
|
||||
@@ -302,7 +302,7 @@
|
||||
m = min(m, cable.amount)
|
||||
if(m)
|
||||
use_cable(m)
|
||||
var/obj/item/weapon/cable_coil/CC = new (get_turf(chassis))
|
||||
var/obj/item/stack/cable_coil/CC = new (get_turf(chassis))
|
||||
CC.amount = m
|
||||
else
|
||||
occupant_message("There's no more cable on the reel.")
|
||||
@@ -314,7 +314,7 @@
|
||||
return "[output] \[Cable: [cable ? cable.amount : 0] m\][(cable && cable.amount) ? "- <a href='?src=\ref[src];toggle=1'>[!equip_ready?"Dea":"A"]ctivate</a>|<a href='?src=\ref[src];cut=1'>Cut</a>" : null]"
|
||||
return
|
||||
|
||||
proc/load_cable(var/obj/item/weapon/cable_coil/CC)
|
||||
proc/load_cable(var/obj/item/stack/cable_coil/CC)
|
||||
if(istype(CC) && CC.amount)
|
||||
var/cur_amount = cable? cable.amount : 0
|
||||
var/to_load = max(max_cable - cur_amount,0)
|
||||
|
||||
@@ -702,9 +702,9 @@
|
||||
state=2
|
||||
user << "You close the hatch to the power unit"
|
||||
return
|
||||
else if(istype(W, /obj/item/weapon/cable_coil))
|
||||
else if(istype(W, /obj/item/stack/cable_coil))
|
||||
if(state == 3 && hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
|
||||
var/obj/item/weapon/cable_coil/CC = W
|
||||
var/obj/item/stack/cable_coil/CC = W
|
||||
if(CC.amount > 1)
|
||||
CC.use(2)
|
||||
clearInternalDamage(MECHA_INT_SHORT_CIRCUIT)
|
||||
|
||||
@@ -18,8 +18,8 @@
|
||||
else if(istype(used_atom, /obj/item/weapon/wirecutters))
|
||||
playsound(holder, 'sound/items/Wirecutter.ogg', 50, 1)
|
||||
|
||||
else if(istype(used_atom, /obj/item/weapon/cable_coil))
|
||||
var/obj/item/weapon/cable_coil/C = used_atom
|
||||
else if(istype(used_atom, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C = used_atom
|
||||
if(C.amount<4)
|
||||
user << ("There's not enough cable to finish the task.")
|
||||
return 0
|
||||
@@ -51,8 +51,8 @@
|
||||
else if(istype(used_atom, /obj/item/weapon/wirecutters))
|
||||
playsound(holder, 'sound/items/Wirecutter.ogg', 50, 1)
|
||||
|
||||
else if(istype(used_atom, /obj/item/weapon/cable_coil))
|
||||
var/obj/item/weapon/cable_coil/C = used_atom
|
||||
else if(istype(used_atom, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C = used_atom
|
||||
if(C.amount<4)
|
||||
user << ("There's not enough cable to finish the task.")
|
||||
return 0
|
||||
@@ -146,7 +146,7 @@
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="The wiring is added"),
|
||||
//12
|
||||
list("key"=/obj/item/weapon/cable_coil,
|
||||
list("key"=/obj/item/stack/cable_coil,
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="The hydraulic systems are active."),
|
||||
//13
|
||||
@@ -190,7 +190,7 @@
|
||||
holder.icon_state = "ripley4"
|
||||
else
|
||||
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
|
||||
var/obj/item/weapon/cable_coil/coil = new /obj/item/weapon/cable_coil(get_turf(holder))
|
||||
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
|
||||
coil.amount = 4
|
||||
holder.icon_state = "ripley2"
|
||||
if(10)
|
||||
@@ -380,7 +380,7 @@
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="The wiring is added"),
|
||||
//18
|
||||
list("key"=/obj/item/weapon/cable_coil,
|
||||
list("key"=/obj/item/stack/cable_coil,
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="The hydraulic systems are active."),
|
||||
//19
|
||||
@@ -424,7 +424,7 @@
|
||||
holder.icon_state = "gygax4"
|
||||
else
|
||||
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
|
||||
var/obj/item/weapon/cable_coil/coil = new /obj/item/weapon/cable_coil(get_turf(holder))
|
||||
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
|
||||
coil.amount = 4
|
||||
holder.icon_state = "gygax2"
|
||||
if(16)
|
||||
@@ -641,7 +641,7 @@
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="The wiring is added"),
|
||||
//13
|
||||
list("key"=/obj/item/weapon/cable_coil,
|
||||
list("key"=/obj/item/stack/cable_coil,
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="The hydraulic systems are active."),
|
||||
//14
|
||||
@@ -685,7 +685,7 @@
|
||||
holder.icon_state = "fireripley4"
|
||||
else
|
||||
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
|
||||
var/obj/item/weapon/cable_coil/coil = new /obj/item/weapon/cable_coil(get_turf(holder))
|
||||
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
|
||||
coil.amount = 4
|
||||
holder.icon_state = "fireripley2"
|
||||
if(11)
|
||||
@@ -961,7 +961,7 @@
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="The wiring is added"),
|
||||
//18
|
||||
list("key"=/obj/item/weapon/cable_coil,
|
||||
list("key"=/obj/item/stack/cable_coil,
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="The hydraulic systems are active."),
|
||||
//19
|
||||
@@ -1006,7 +1006,7 @@
|
||||
holder.icon_state = "durand4"
|
||||
else
|
||||
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
|
||||
var/obj/item/weapon/cable_coil/coil = new /obj/item/weapon/cable_coil(get_turf(holder))
|
||||
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
|
||||
coil.amount = 4
|
||||
holder.icon_state = "durand2"
|
||||
if(16)
|
||||
@@ -1241,7 +1241,7 @@
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="The wiring is added"),
|
||||
//12
|
||||
list("key"=/obj/item/weapon/cable_coil,
|
||||
list("key"=/obj/item/stack/cable_coil,
|
||||
"backkey"=/obj/item/weapon/screwdriver,
|
||||
"desc"="The hydraulic systems are active."),
|
||||
//13
|
||||
@@ -1285,7 +1285,7 @@
|
||||
holder.icon_state = "odysseus4"
|
||||
else
|
||||
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
|
||||
var/obj/item/weapon/cable_coil/coil = new /obj/item/weapon/cable_coil(get_turf(holder))
|
||||
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
|
||||
coil.amount = 4
|
||||
holder.icon_state = "odysseus2"
|
||||
if(10)
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
anchored = 0
|
||||
opacity = 0
|
||||
var/list/welder_salvage = list(/obj/item/stack/sheet/plasteel,/obj/item/stack/sheet/metal,/obj/item/stack/rods)
|
||||
var/list/wirecutters_salvage = list(/obj/item/weapon/cable_coil)
|
||||
var/list/wirecutters_salvage = list(/obj/item/stack/cable_coil)
|
||||
var/list/crowbar_salvage = list()
|
||||
var/salvage_num = 5
|
||||
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
/proc/gibs(atom/location, var/list/viruses, var/datum/dna/MobDNA)
|
||||
new /obj/effect/gibspawner/generic(get_turf(location),viruses,MobDNA)
|
||||
new /obj/effect/gibspawner/generic(location,viruses,MobDNA)
|
||||
|
||||
/proc/hgibs(atom/location, var/list/viruses, var/datum/dna/MobDNA)
|
||||
new /obj/effect/gibspawner/human(get_turf(location),viruses,MobDNA)
|
||||
new /obj/effect/gibspawner/human(location,viruses,MobDNA)
|
||||
|
||||
/proc/xgibs(atom/location, var/list/viruses)
|
||||
new /obj/effect/gibspawner/xeno(get_turf(location),viruses)
|
||||
new /obj/effect/gibspawner/xeno(location,viruses)
|
||||
|
||||
/proc/robogibs(atom/location, var/list/viruses)
|
||||
new /obj/effect/gibspawner/robot(get_turf(location),viruses)
|
||||
new /obj/effect/gibspawner/robot(location,viruses)
|
||||
|
||||
/obj/effect/gibspawner
|
||||
var/sparks = 0 //whether sparks spread on Gib()
|
||||
@@ -20,8 +20,7 @@
|
||||
New(location, var/list/viruses, var/datum/dna/MobDNA)
|
||||
..()
|
||||
|
||||
if(istype(loc,/turf)) //basically if a badmin spawns it
|
||||
Gib(loc,viruses,MobDNA)
|
||||
Gib(loc,viruses,MobDNA)
|
||||
|
||||
proc/Gib(atom/location, var/list/viruses = list(), var/datum/dna/MobDNA = null)
|
||||
if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
|
||||
@@ -43,6 +42,9 @@
|
||||
for(var/j = 1, j<= gibamounts[i], j++)
|
||||
var/gibType = gibtypes[i]
|
||||
gib = new gibType(location)
|
||||
if(istype(location,/mob/living/carbon))
|
||||
var/mob/living/carbon/digester = location
|
||||
digester.stomach_contents += gib
|
||||
|
||||
if(viruses.len > 0)
|
||||
for(var/datum/disease/D in viruses)
|
||||
@@ -59,7 +61,8 @@
|
||||
else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey
|
||||
gib.blood_DNA["Non-human DNA"] = "A+"
|
||||
var/list/directions = gibdirections[i]
|
||||
if(directions.len)
|
||||
gib.streak(directions)
|
||||
if(istype(loc,/turf))
|
||||
if(directions.len)
|
||||
gib.streak(directions)
|
||||
|
||||
del(src)
|
||||
@@ -93,7 +93,7 @@
|
||||
desc = "It never stays still for long."
|
||||
icon_state = "spiderling"
|
||||
anchored = 0
|
||||
layer = 2.7
|
||||
layer = 2.75
|
||||
health = 3
|
||||
var/amount_grown = 0
|
||||
var/grow_as = null
|
||||
|
||||
@@ -2,16 +2,12 @@
|
||||
name = "item"
|
||||
icon = 'icons/obj/items.dmi'
|
||||
var/item_state = null
|
||||
var/r_speed = 1.0
|
||||
var/health = null
|
||||
var/burn_point = null
|
||||
var/burning = null
|
||||
var/hitsound = null
|
||||
var/throwhitsound = null
|
||||
var/w_class = 3.0
|
||||
var/slot_flags = 0 //This is used to determine on which slots an item can fit.
|
||||
pass_flags = PASSTABLE
|
||||
pressure_resistance = 5
|
||||
// causeerrorheresoifixthis
|
||||
var/obj/item/master = null
|
||||
|
||||
var/heat_protection = 0 //flags which determine which body parts are protected from heat. Use the HEAD, CHEST, GROIN, etc. flags. See setup.dm
|
||||
@@ -108,7 +104,16 @@
|
||||
if(src.blood_DNA)
|
||||
f_name = "a bloody [name]"
|
||||
|
||||
usr << "\icon[src]This is [f_name]. It is a [size] item."
|
||||
var/determiner
|
||||
var/pronoun
|
||||
if(src.gender == PLURAL)
|
||||
determiner = "These are"
|
||||
pronoun = "They are"
|
||||
else
|
||||
determiner = "This is"
|
||||
pronoun = "It is"
|
||||
|
||||
usr << "\icon[src][determiner] [f_name]. [pronoun] a [size] item." //e.g. These are some gloves. They are a small item. or This is a toolbox. It is a bulky item.
|
||||
|
||||
if(src.desc)
|
||||
usr << src.desc
|
||||
@@ -556,4 +561,5 @@
|
||||
/obj/item/clothing/gloves/clean_blood()
|
||||
. = ..()
|
||||
if(.)
|
||||
transfer_blood = 0
|
||||
transfer_blood = 0
|
||||
bloody_hands_mob = null
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
usr << "\red There is another network terminal here."
|
||||
return
|
||||
else
|
||||
var/obj/item/weapon/cable_coil/C = new /obj/item/weapon/cable_coil(loc)
|
||||
var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(loc)
|
||||
C.amount = 10
|
||||
usr << "You cut the cables and disassemble the unused power terminal."
|
||||
del(T)
|
||||
|
||||
@@ -125,6 +125,8 @@ A list of items and costs is stored under the datum of every game mode, alongsid
|
||||
desc = "There is something wrong if you're examining this."
|
||||
|
||||
/obj/item/device/uplink/hidden/Topic(href, href_list)
|
||||
if(usr.stat || usr.restrained() || usr.paralysis || usr.stunned || usr.weakened)
|
||||
return 0 // To stop people using their uplink when they shouldn't be able to
|
||||
..()
|
||||
if(href_list["lock"])
|
||||
toggle()
|
||||
|
||||
@@ -239,12 +239,12 @@
|
||||
W.loc = src
|
||||
src.cell = W
|
||||
user << "\blue You insert the cell!"
|
||||
if(istype(W, /obj/item/weapon/cable_coil))
|
||||
if(istype(W, /obj/item/stack/cable_coil))
|
||||
if(src.wires)
|
||||
user << "\blue You have already inserted wire!"
|
||||
return
|
||||
else
|
||||
var/obj/item/weapon/cable_coil/coil = W
|
||||
var/obj/item/stack/cable_coil/coil = W
|
||||
coil.use(1)
|
||||
src.wires = 1.0
|
||||
user << "\blue You insert the wire!"
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
/obj/item/stack/sheet/glass/attackby(obj/item/W, mob/user)
|
||||
..()
|
||||
add_fingerprint(user)
|
||||
if(istype(W,/obj/item/weapon/cable_coil))
|
||||
var/obj/item/weapon/cable_coil/CC = W
|
||||
if(istype(W,/obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/CC = W
|
||||
if(CC.amount < 5)
|
||||
user << "\b There is not enough wire in this coil. You need 5 lengths."
|
||||
return
|
||||
@@ -248,6 +248,7 @@
|
||||
item_state = "shard-glass"
|
||||
g_amt = 3750
|
||||
attack_verb = list("stabbed", "slashed", "sliced", "cut")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
suicide_act(mob/user)
|
||||
viewers(user) << pick("<span class='suicide'>[user] is slitting \his wrists with the shard of glass! It looks like \he's trying to commit suicide.</span>", \
|
||||
@@ -268,12 +269,6 @@
|
||||
pixel_x = rand(-5, 5)
|
||||
pixel_y = rand(-5, 5)
|
||||
|
||||
|
||||
/obj/item/weapon/shard/attack(mob/M, mob/user)
|
||||
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/weapon/shard/afterattack(atom/A as mob|obj, mob/user, proximity)
|
||||
if(!proximity || !(src in user)) return
|
||||
if(isturf(A))
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
/obj/item/stack/light_w/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
..()
|
||||
if(istype(O,/obj/item/weapon/wirecutters))
|
||||
var/obj/item/weapon/cable_coil/CC = new (user.loc)
|
||||
var/obj/item/stack/cable_coil/CC = new (user.loc)
|
||||
CC.amount = 5
|
||||
CC.add_fingerprint(user)
|
||||
amount--
|
||||
|
||||
+131
-65
@@ -314,7 +314,7 @@
|
||||
active = !( active )
|
||||
if (active)
|
||||
user << "\blue You extend the plastic blade with a quick flick of your wrist."
|
||||
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
|
||||
playsound(user, 'sound/weapons/saberon.ogg', 20, 1)
|
||||
if(hacked)
|
||||
icon_state = "swordrainbow"
|
||||
item_state = "swordrainbow"
|
||||
@@ -324,7 +324,7 @@
|
||||
w_class = 4
|
||||
else
|
||||
user << "\blue You push the plastic blade back down into the handle."
|
||||
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
|
||||
playsound(user, 'sound/weapons/saberoff.ogg', 20, 1)
|
||||
icon_state = "sword0"
|
||||
item_state = "sword0"
|
||||
w_class = 2
|
||||
@@ -399,6 +399,7 @@
|
||||
throwforce = 5
|
||||
w_class = 3
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
/*
|
||||
* Crayons
|
||||
@@ -566,15 +567,35 @@
|
||||
|
||||
|
||||
obj/item/toy/cards
|
||||
name = "deck of cards"
|
||||
desc = "A deck of space-grade playing cards."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "deck_full"
|
||||
w_class = 2.0
|
||||
var/list/cards = list()
|
||||
var/parentdeck = null
|
||||
var/deckstyle = "nanotrasen"
|
||||
var/card_hitsound = null
|
||||
var/card_force = 0
|
||||
var/card_throwforce = 0
|
||||
var/card_throw_speed = 4
|
||||
var/card_throw_range = 20
|
||||
var/list/card_attack_verb = list("attacked")
|
||||
|
||||
obj/item/toy/cards/New()
|
||||
..()
|
||||
|
||||
obj/item/toy/cards/proc/apply_card_vars(obj/item/toy/cards/newobj, obj/item/toy/cards/sourceobj) // Applies variables for supporting multiple types of card deck
|
||||
if(!istype(sourceobj))
|
||||
return
|
||||
|
||||
obj/item/toy/cards/deck
|
||||
name = "deck of cards"
|
||||
desc = "A deck of space-grade playing cards."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
deckstyle = "nanotrasen"
|
||||
icon_state = "deck_nanotrasen_full"
|
||||
w_class = 2.0
|
||||
var/cooldown = 0
|
||||
var/list/cards = list()
|
||||
|
||||
obj/item/toy/cards/deck/New()
|
||||
..()
|
||||
icon_state = "deck_[deckstyle]_full"
|
||||
for(var/i = 2; i <= 10; i++)
|
||||
cards += "[i] of Hearts"
|
||||
cards += "[i] of Spades"
|
||||
@@ -598,33 +619,37 @@ obj/item/toy/cards/New()
|
||||
cards += "Ace of Diamonds"
|
||||
|
||||
|
||||
obj/item/toy/cards/attack_hand(mob/user as mob)
|
||||
obj/item/toy/cards/deck/attack_hand(mob/user as mob)
|
||||
var/choice = null
|
||||
if(cards.len == 0)
|
||||
src.icon_state = "deck_empty"
|
||||
src.icon_state = "deck_[deckstyle]_empty"
|
||||
user << "<span class='notice'>There are no more cards to draw.</span>"
|
||||
return
|
||||
var/obj/item/toy/singlecard/H = new/obj/item/toy/singlecard(user.loc)
|
||||
var/obj/item/toy/cards/singlecard/H = new/obj/item/toy/cards/singlecard(user.loc)
|
||||
choice = cards[1]
|
||||
H.cardname = choice
|
||||
H.parentdeck = src
|
||||
var/O = src
|
||||
H.apply_card_vars(H,O)
|
||||
src.cards -= choice
|
||||
H.pickup(user)
|
||||
user.put_in_active_hand(H)
|
||||
src.visible_message("<span class='notice'>[user] draws a card from the deck.</span>", "<span class='notice'>You draw a card from the deck.</span>")
|
||||
if(cards.len > 26)
|
||||
src.icon_state = "deck_full"
|
||||
src.icon_state = "deck_[deckstyle]_full"
|
||||
else if(cards.len > 10)
|
||||
src.icon_state = "deck_half"
|
||||
src.icon_state = "deck_[deckstyle]_half"
|
||||
else if(cards.len > 1)
|
||||
src.icon_state = "deck_low"
|
||||
src.icon_state = "deck_[deckstyle]_low"
|
||||
|
||||
obj/item/toy/cards/attack_self(mob/user as mob)
|
||||
cards = shuffle(cards)
|
||||
playsound(user, 'sound/items/cardshuffle.ogg', 50, 1)
|
||||
user.visible_message("<span class='notice'>[user] shuffles the deck.</span>", "<span class='notice'>You shuffle the deck.</span>")
|
||||
obj/item/toy/cards/deck/attack_self(mob/user as mob)
|
||||
if(cooldown < world.time - 50)
|
||||
cards = shuffle(cards)
|
||||
playsound(user, 'sound/items/cardshuffle.ogg', 50, 1)
|
||||
user.visible_message("<span class='notice'>[user] shuffles the deck.</span>", "<span class='notice'>You shuffle the deck.</span>")
|
||||
cooldown = world.time
|
||||
|
||||
obj/item/toy/cards/attackby(obj/item/toy/singlecard/C, mob/living/user)
|
||||
obj/item/toy/cards/deck/attackby(obj/item/toy/cards/singlecard/C, mob/living/user)
|
||||
..()
|
||||
if(istype(C))
|
||||
if(C.parentdeck == src)
|
||||
@@ -635,14 +660,14 @@ obj/item/toy/cards/attackby(obj/item/toy/singlecard/C, mob/living/user)
|
||||
else
|
||||
user << "<span class='notice'>You can't mix cards from other decks.</span>"
|
||||
if(cards.len > 26)
|
||||
src.icon_state = "deck_full"
|
||||
src.icon_state = "deck_[deckstyle]_full"
|
||||
else if(cards.len > 10)
|
||||
src.icon_state = "deck_half"
|
||||
src.icon_state = "deck_[deckstyle]_half"
|
||||
else if(cards.len > 1)
|
||||
src.icon_state = "deck_low"
|
||||
src.icon_state = "deck_[deckstyle]_low"
|
||||
|
||||
|
||||
obj/item/toy/cards/attackby(obj/item/toy/cardhand/C, mob/living/user)
|
||||
obj/item/toy/cards/deck/attackby(obj/item/toy/cards/cardhand/C, mob/living/user)
|
||||
..()
|
||||
if(istype(C))
|
||||
if(C.parentdeck == src)
|
||||
@@ -653,13 +678,13 @@ obj/item/toy/cards/attackby(obj/item/toy/cardhand/C, mob/living/user)
|
||||
else
|
||||
user << "<span class='notice'>You can't mix cards from other decks.</span>"
|
||||
if(cards.len > 26)
|
||||
src.icon_state = "deck_full"
|
||||
src.icon_state = "deck_[deckstyle]_full"
|
||||
else if(cards.len > 10)
|
||||
src.icon_state = "deck_half"
|
||||
src.icon_state = "deck_[deckstyle]_half"
|
||||
else if(cards.len > 1)
|
||||
src.icon_state = "deck_low"
|
||||
src.icon_state = "deck_[deckstyle]_low"
|
||||
|
||||
obj/item/toy/cards/MouseDrop(atom/over_object)
|
||||
obj/item/toy/cards/deck/MouseDrop(atom/over_object)
|
||||
var/mob/M = usr
|
||||
if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained())
|
||||
return
|
||||
@@ -683,22 +708,21 @@ obj/item/toy/cards/MouseDrop(atom/over_object)
|
||||
|
||||
|
||||
|
||||
obj/item/toy/cardhand
|
||||
obj/item/toy/cards/cardhand
|
||||
name = "hand of cards"
|
||||
desc = "A number of cards not in a deck, customarily held in ones hand."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "hand2"
|
||||
icon_state = "nanotrasen_hand2"
|
||||
w_class = 1.0
|
||||
var/list/currenthand = list()
|
||||
var/obj/item/toy/cards/parentdeck = null
|
||||
var/choice = null
|
||||
|
||||
|
||||
obj/item/toy/cardhand/attack_self(mob/user as mob)
|
||||
obj/item/toy/cards/cardhand/attack_self(mob/user as mob)
|
||||
user.set_machine(src)
|
||||
interact(user)
|
||||
|
||||
obj/item/toy/cardhand/interact(mob/user)
|
||||
obj/item/toy/cards/cardhand/interact(mob/user)
|
||||
var/dat = "You have:<BR>"
|
||||
for(var/t in currenthand)
|
||||
dat += "<A href='?src=\ref[src];pick=[t]'>A [t].</A><BR>"
|
||||
@@ -709,36 +733,37 @@ obj/item/toy/cardhand/interact(mob/user)
|
||||
popup.open()
|
||||
|
||||
|
||||
obj/item/toy/cardhand/Topic(href, href_list)
|
||||
obj/item/toy/cards/cardhand/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
if(usr.stat || !ishuman(usr) || !usr.canmove)
|
||||
return
|
||||
var/mob/living/carbon/human/cardUser = usr
|
||||
var/O = src
|
||||
if(href_list["pick"])
|
||||
if (cardUser.get_item_by_slot(slot_l_hand) == src || cardUser.get_item_by_slot(slot_r_hand) == src)
|
||||
var/choice = href_list["pick"]
|
||||
var/obj/item/toy/singlecard/C = new/obj/item/toy/singlecard(cardUser.loc)
|
||||
var/obj/item/toy/cards/singlecard/C = new/obj/item/toy/cards/singlecard(cardUser.loc)
|
||||
src.currenthand -= choice
|
||||
C.parentdeck = src.parentdeck
|
||||
C.cardname = choice
|
||||
C.apply_card_vars(C,O)
|
||||
C.pickup(cardUser)
|
||||
cardUser.put_in_any_hand_if_possible(C)
|
||||
cardUser.visible_message("<span class='notice'>[cardUser] draws a card from \his hand.</span>", "<span class='notice'>You take the [C.cardname] from your hand.</span>")
|
||||
|
||||
interact(cardUser)
|
||||
|
||||
if(src.currenthand.len < 3)
|
||||
src.icon_state = "hand2"
|
||||
src.icon_state = "[deckstyle]_hand2"
|
||||
else if(src.currenthand.len < 4)
|
||||
src.icon_state = "hand3"
|
||||
src.icon_state = "[deckstyle]_hand3"
|
||||
else if(src.currenthand.len < 5)
|
||||
src.icon_state = "hand4"
|
||||
|
||||
src.icon_state = "[deckstyle]_hand4"
|
||||
if(src.currenthand.len == 1)
|
||||
var/obj/item/toy/singlecard/N = new/obj/item/toy/singlecard(src.loc)
|
||||
var/obj/item/toy/cards/singlecard/N = new/obj/item/toy/cards/singlecard(src.loc)
|
||||
N.parentdeck = src.parentdeck
|
||||
N.cardname = src.currenthand[1]
|
||||
N.apply_card_vars(N,O)
|
||||
cardUser.u_equip(src)
|
||||
N.pickup(cardUser)
|
||||
cardUser.put_in_any_hand_if_possible(N)
|
||||
@@ -747,7 +772,7 @@ obj/item/toy/cardhand/Topic(href, href_list)
|
||||
del(src)
|
||||
return
|
||||
|
||||
obj/item/toy/cardhand/attackby(obj/item/toy/singlecard/C, mob/living/user)
|
||||
obj/item/toy/cards/cardhand/attackby(obj/item/toy/cards/singlecard/C, mob/living/user)
|
||||
if(istype(C))
|
||||
if(C.parentdeck == src.parentdeck)
|
||||
src.currenthand += C.cardname
|
||||
@@ -755,31 +780,39 @@ obj/item/toy/cardhand/attackby(obj/item/toy/singlecard/C, mob/living/user)
|
||||
user.visible_message("<span class='notice'>[user] adds a card to their hand.</span>", "<span class='notice'>You add the [C.cardname] to your hand.</span>")
|
||||
interact(user)
|
||||
if(currenthand.len > 4)
|
||||
src.icon_state = "hand5"
|
||||
src.icon_state = "[deckstyle]_hand5"
|
||||
else if(currenthand.len > 3)
|
||||
src.icon_state = "hand4"
|
||||
src.icon_state = "[deckstyle]_hand4"
|
||||
else if(currenthand.len > 2)
|
||||
src.icon_state = "hand3"
|
||||
src.icon_state = "[deckstyle]_hand3"
|
||||
del(C)
|
||||
else
|
||||
user << "<span class='notice'>You can't mix cards from other decks.</span>"
|
||||
|
||||
obj/item/toy/cards/cardhand/apply_card_vars(obj/item/toy/cards/newobj,obj/item/toy/cards/sourceobj)
|
||||
..()
|
||||
newobj.deckstyle = sourceobj.deckstyle
|
||||
newobj.icon_state = "[deckstyle]_hand2" // Another dumb hack, without this the hand is invisible (or has the default deckstyle) until another card is added.
|
||||
newobj.card_hitsound = sourceobj.card_hitsound
|
||||
newobj.card_force = sourceobj.card_force
|
||||
newobj.card_throwforce = sourceobj.card_throwforce
|
||||
newobj.card_throw_speed = sourceobj.card_throw_speed
|
||||
newobj.card_throw_range = sourceobj.card_throw_range
|
||||
newobj.card_attack_verb = sourceobj.card_attack_verb
|
||||
|
||||
|
||||
|
||||
|
||||
obj/item/toy/singlecard
|
||||
obj/item/toy/cards/singlecard
|
||||
name = "card"
|
||||
desc = "a card"
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "singlecard_down"
|
||||
icon_state = "singlecard_nanotrasen_down"
|
||||
w_class = 1.0
|
||||
var/cardname = null
|
||||
var/obj/item/toy/cards/parentdeck = null
|
||||
var/flipped = 0
|
||||
pixel_x = -5
|
||||
|
||||
obj/item/toy/singlecard/examine()
|
||||
|
||||
obj/item/toy/cards/singlecard/examine()
|
||||
set src in usr.contents
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/cardUser = usr
|
||||
@@ -789,7 +822,7 @@ obj/item/toy/singlecard/examine()
|
||||
cardUser << "<span class='notice'>You need to have the card in your hand to check it.</span>"
|
||||
|
||||
|
||||
obj/item/toy/singlecard/verb/Flip()
|
||||
obj/item/toy/cards/singlecard/verb/Flip()
|
||||
set name = "Flip Card"
|
||||
set category = "Object"
|
||||
set src in range(1)
|
||||
@@ -798,26 +831,27 @@ obj/item/toy/singlecard/verb/Flip()
|
||||
if(!flipped)
|
||||
src.flipped = 1
|
||||
if (cardname)
|
||||
src.icon_state = "sc_[cardname]"
|
||||
src.icon_state = "sc_[cardname]_[deckstyle]"
|
||||
src.name = src.cardname
|
||||
else
|
||||
src.icon_state = "sc_Ace of Spades"
|
||||
src.icon_state = "sc_Ace of Spades_[deckstyle]"
|
||||
src.name = "What Card"
|
||||
src.pixel_x = 5
|
||||
else if(flipped)
|
||||
src.flipped = 0
|
||||
src.icon_state = "singlecard_down"
|
||||
src.icon_state = "singlecard_down_[deckstyle]"
|
||||
src.name = "card"
|
||||
src.pixel_x = -5
|
||||
|
||||
obj/item/toy/singlecard/attackby(obj/item/I, mob/living/user)
|
||||
if(istype(I, /obj/item/toy/singlecard/))
|
||||
var/obj/item/toy/singlecard/C = I
|
||||
obj/item/toy/cards/singlecard/attackby(obj/item/I, mob/living/user)
|
||||
if(istype(I, /obj/item/toy/cards/singlecard/))
|
||||
var/obj/item/toy/cards/singlecard/C = I
|
||||
if(C.parentdeck == src.parentdeck)
|
||||
var/obj/item/toy/cardhand/H = new/obj/item/toy/cardhand(user.loc)
|
||||
var/obj/item/toy/cards/cardhand/H = new/obj/item/toy/cards/cardhand(user.loc)
|
||||
H.currenthand += C.cardname
|
||||
H.currenthand += src.cardname
|
||||
H.parentdeck = C.parentdeck
|
||||
H.apply_card_vars(H,C)
|
||||
user.u_equip(C)
|
||||
H.pickup(user)
|
||||
user.put_in_active_hand(H)
|
||||
@@ -827,29 +861,62 @@ obj/item/toy/singlecard/attackby(obj/item/I, mob/living/user)
|
||||
else
|
||||
user << "<span class='notice'>You can't mix cards from other decks.</span>"
|
||||
|
||||
if(istype(I, /obj/item/toy/cardhand/))
|
||||
var/obj/item/toy/cardhand/H = I
|
||||
if(istype(I, /obj/item/toy/cards/cardhand/))
|
||||
var/obj/item/toy/cards/cardhand/H = I
|
||||
if(H.parentdeck == parentdeck)
|
||||
H.currenthand += cardname
|
||||
user.u_equip(src)
|
||||
user.visible_message("<span class='notice'>[user] adds a card to \his hand.</span>", "<span class='notice'>You add the [cardname] to your hand.</span>")
|
||||
H.interact(user)
|
||||
if(H.currenthand.len > 4)
|
||||
H.icon_state = "hand5"
|
||||
H.icon_state = "[deckstyle]_hand5"
|
||||
else if(H.currenthand.len > 3)
|
||||
H.icon_state = "hand4"
|
||||
H.icon_state = "[deckstyle]_hand4"
|
||||
else if(H.currenthand.len > 2)
|
||||
H.icon_state = "hand3"
|
||||
H.icon_state = "[deckstyle]_hand3"
|
||||
del(src)
|
||||
else
|
||||
user << "<span class='notice'>You can't mix cards from other decks.</span>"
|
||||
|
||||
|
||||
obj/item/toy/singlecard/attack_self(mob/user)
|
||||
obj/item/toy/cards/singlecard/attack_self(mob/user)
|
||||
if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained())
|
||||
return
|
||||
Flip()
|
||||
|
||||
obj/item/toy/cards/singlecard/apply_card_vars(obj/item/toy/cards/singlecard/newobj,obj/item/toy/cards/sourceobj)
|
||||
..()
|
||||
newobj.deckstyle = sourceobj.deckstyle
|
||||
newobj.icon_state = "singlecard_down_[deckstyle]" // Without this the card is invisible until flipped. It's an ugly hack, but it works.
|
||||
newobj.card_hitsound = sourceobj.card_hitsound
|
||||
newobj.hitsound = newobj.card_hitsound
|
||||
newobj.card_force = sourceobj.card_force
|
||||
newobj.force = newobj.card_force
|
||||
newobj.card_throwforce = sourceobj.card_throwforce
|
||||
newobj.throwforce = newobj.card_throwforce
|
||||
newobj.card_throw_speed = sourceobj.card_throw_speed
|
||||
newobj.throw_speed = newobj.card_throw_speed
|
||||
newobj.card_throw_range = sourceobj.card_throw_range
|
||||
newobj.throw_range = newobj.card_throw_range
|
||||
newobj.card_attack_verb = sourceobj.card_attack_verb
|
||||
newobj.attack_verb = newobj.card_attack_verb
|
||||
|
||||
|
||||
/*
|
||||
|| Syndicate playing cards, for pretending you're Gambit and playing poker for the nuke disk. ||
|
||||
*/
|
||||
|
||||
obj/item/toy/cards/deck/syndicate
|
||||
name = "suspicious looking deck of cards"
|
||||
desc = "A deck of space-grade playing cards. They seem unusually rigid."
|
||||
deckstyle = "syndicate"
|
||||
card_hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
card_force = 15
|
||||
card_throwforce = 15
|
||||
card_throw_speed = 6
|
||||
card_throw_range = 20
|
||||
card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut")
|
||||
|
||||
|
||||
/obj/item/toy/nuke
|
||||
name = "\improper Nuclear Fission Explosive toy"
|
||||
@@ -879,4 +946,3 @@ obj/item/toy/singlecard/attack_self(mob/user)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -24,14 +24,20 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
var/smoketime = 5
|
||||
w_class = 1.0
|
||||
origin_tech = "materials=1"
|
||||
attack_verb = list("burnt", "singed")
|
||||
attack_verb = null
|
||||
|
||||
/obj/item/weapon/match/process()
|
||||
var/turf/location = get_turf(src)
|
||||
smoketime--
|
||||
if(smoketime < 1)
|
||||
icon_state = "match_burnt"
|
||||
lit = -1
|
||||
damtype = "brute"
|
||||
force = 0
|
||||
icon_state = "match_burnt"
|
||||
item_state = "cigoff"
|
||||
name = "burnt match"
|
||||
desc = "A match. This one has seen better days."
|
||||
attack_verb = null
|
||||
processing_objects.Remove(src)
|
||||
return
|
||||
if(location)
|
||||
@@ -46,6 +52,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
item_state = "cigoff"
|
||||
name = "burnt match"
|
||||
desc = "A match. This one has seen better days."
|
||||
attack_verb = null
|
||||
return ..()
|
||||
|
||||
//////////////////
|
||||
@@ -59,7 +66,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
item_state = "cigoff"
|
||||
w_class = 1
|
||||
body_parts_covered = null
|
||||
attack_verb = list("burnt", "singed")
|
||||
attack_verb = null
|
||||
var/lit = 0
|
||||
var/icon_on = "cigon" //Note - these are in masks.dmi not in cigarette.dmi
|
||||
var/icon_off = "cigoff"
|
||||
@@ -96,7 +103,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
|
||||
else if(istype(W, /obj/item/weapon/match))
|
||||
var/obj/item/weapon/match/M = W
|
||||
if(M.lit)
|
||||
if(M.lit == 1) //checking for lit = 1 instead of just lit prevents cigarettes being lit by used matches
|
||||
light("<span class='notice'>[user] lights their [name] with [W].</span>")
|
||||
|
||||
else if(istype(W, /obj/item/weapon/melee/energy/sword))
|
||||
@@ -134,7 +141,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
/obj/item/clothing/mask/cigarette/proc/light(var/flavor_text = "[usr] lights the [name].")
|
||||
if(!src.lit)
|
||||
src.lit = 1
|
||||
damtype = "fire"
|
||||
name = "lit [name]"
|
||||
if(!istype(src, /obj/item/clothing/mask/cigarette/pipe)) //can't burn people with pipes
|
||||
attack_verb = list("burnt", "singed")
|
||||
hitsound = 'sound/items/welder.ogg'
|
||||
damtype = "fire"
|
||||
force = 4
|
||||
if(reagents.get_reagent_amount("plasma")) // the plasma explodes when exposed to fire
|
||||
var/datum/effect/effect/system/reagents_explosion/e = new()
|
||||
e.set_up(round(reagents.get_reagent_amount("plasma") / 2.5, 1), get_turf(src), 0, 0)
|
||||
@@ -215,7 +227,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
/obj/item/clothing/mask/cigarette/attack(mob/living/carbon/M, mob/living/carbon/user)
|
||||
if(!istype(M))
|
||||
return ..()
|
||||
|
||||
if(istype(M.wear_mask, /obj/item/clothing/mask/cigarette) && user.zone_sel && user.zone_sel.selecting == "mouth" && lit)
|
||||
var/obj/item/clothing/mask/cigarette/cig = M.wear_mask
|
||||
if(M == user)
|
||||
@@ -403,7 +414,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
throwforce = 4
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
attack_verb = list("burnt", "singed")
|
||||
attack_verb = null
|
||||
var/lit = 0
|
||||
|
||||
/obj/item/weapon/lighter/zippo
|
||||
@@ -427,6 +438,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
lit = 1
|
||||
icon_state = icon_on
|
||||
item_state = icon_on
|
||||
force = 5
|
||||
damtype = "fire"
|
||||
hitsound = 'sound/items/welder.ogg'
|
||||
attack_verb = list("burnt", "singed")
|
||||
if(istype(src, /obj/item/weapon/lighter/zippo) )
|
||||
user.visible_message("<span class='rose'>Without even breaking stride, [user] flips open and lights [src] in one smooth movement.</span>")
|
||||
else
|
||||
@@ -443,6 +458,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
lit = 0
|
||||
icon_state = icon_off
|
||||
item_state = icon_off
|
||||
hitsound = "swing_hit"
|
||||
force = 0
|
||||
attack_verb = null //human_defense.dm takes care of it
|
||||
if(istype(src, /obj/item/weapon/lighter/zippo) )
|
||||
user.visible_message("<span class='rose'>You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing. Wow.")
|
||||
else
|
||||
|
||||
@@ -54,8 +54,8 @@
|
||||
timer = newtime
|
||||
user << "Timer set for [timer] seconds."
|
||||
|
||||
/obj/item/weapon/plastique/afterattack(atom/target as obj|turf, mob/user as mob, flag)
|
||||
if (!flag)
|
||||
/obj/item/weapon/plastique/preattack(atom/target as obj|turf, mob/user as mob,proximity_flag)
|
||||
if (!proximity_flag)
|
||||
return
|
||||
if (istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage/))
|
||||
return
|
||||
@@ -84,6 +84,7 @@
|
||||
user << "Bomb has been planted. Timer counting down from [timer]."
|
||||
spawn(timer*10)
|
||||
explode(get_turf(target))
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/plastique/proc/explode(var/location)
|
||||
|
||||
|
||||
@@ -30,9 +30,8 @@
|
||||
if(stage == READY && !active)
|
||||
var/turf/bombturf = get_turf(src)
|
||||
var/area/A = get_area(bombturf)
|
||||
var/log_str = "[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>."
|
||||
message_admins(log_str)
|
||||
log_game(log_str)
|
||||
message_admins("[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
|
||||
log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
|
||||
if(nadeassembly)
|
||||
nadeassembly.attack_self(user)
|
||||
else if(clown_check(user))
|
||||
@@ -92,8 +91,8 @@
|
||||
icon_state = initial(icon_state) + "_ass"
|
||||
user << "<span class='notice'>You add [A] to [src]!</span>"
|
||||
|
||||
else if(stage == EMPTY && istype(I, /obj/item/weapon/cable_coil))
|
||||
var/obj/item/weapon/cable_coil/C = I
|
||||
else if(stage == EMPTY && istype(I, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C = I
|
||||
C.use(1)
|
||||
|
||||
stage = WIRED
|
||||
@@ -351,4 +350,4 @@
|
||||
|
||||
#undef EMPTY
|
||||
#undef WIRED
|
||||
#undef READY
|
||||
#undef READY
|
||||
|
||||
@@ -49,9 +49,9 @@
|
||||
|
||||
|
||||
/obj/item/weapon/grenade/iedcasing/attackby(var/obj/item/I, mob/user as mob) //Wiring the can for ignition
|
||||
if(istype(I, /obj/item/weapon/cable_coil))
|
||||
if(istype(I, /obj/item/stack/cable_coil))
|
||||
if(assembled == 1)
|
||||
var/obj/item/weapon/cable_coil/C = I
|
||||
var/obj/item/stack/cable_coil/C = I
|
||||
C.use(1)
|
||||
assembled = 2
|
||||
user << "<span class='notice'>You wire the igniter to detonate the fuel.</span>"
|
||||
@@ -72,9 +72,9 @@
|
||||
add_fingerprint(user)
|
||||
var/turf/bombturf = get_turf(src)
|
||||
var/area/A = get_area(bombturf)
|
||||
var/log_str = "[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>."
|
||||
message_admins(log_str)
|
||||
log_game(log_str)
|
||||
|
||||
message_admins("[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
|
||||
log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.throw_mode_on()
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
flags = CONDUCT
|
||||
origin_tech = "materials=1"
|
||||
attack_verb = list("attacked", "stabbed", "poked")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
/obj/item/weapon/kitchen/utensil/New()
|
||||
if (prob(60))
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/weapon/melee/energy
|
||||
/obj/item/weapon/melee/energy/
|
||||
var/active = 0
|
||||
|
||||
/obj/item/weapon/melee/energy/suicide_act(mob/user)
|
||||
@@ -15,6 +15,7 @@
|
||||
icon_state = "axe0"
|
||||
force = 40.0
|
||||
throwforce = 25.0
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = 3.0
|
||||
@@ -30,18 +31,18 @@
|
||||
active = !active
|
||||
if(active)
|
||||
user << "<span class='notice'>[src] is now energised.</span>"
|
||||
force = 150
|
||||
force = 150 //these are the drugs, friend
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
icon_state = "axe1"
|
||||
w_class = 5
|
||||
else
|
||||
user << "<span class='notice'>[src] can now be concealed.</span>"
|
||||
force = 40
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
icon_state = "axe0"
|
||||
w_class = 5
|
||||
w_class = 3 //it goes back to three you goose
|
||||
add_fingerprint(user)
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/melee/energy/sword
|
||||
color
|
||||
name = "energy sword"
|
||||
@@ -49,12 +50,12 @@
|
||||
icon_state = "sword0"
|
||||
force = 3.0
|
||||
throwforce = 5.0
|
||||
hitsound = "swing_hit" //it starts deactivated
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = 2.0
|
||||
flags = NOSHIELD
|
||||
origin_tech = "magnets=3;syndicate=4"
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
var/hacked = 0
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/New()
|
||||
@@ -73,27 +74,30 @@
|
||||
if (active)
|
||||
force = 30
|
||||
throwforce = 20
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
if(istype(src,/obj/item/weapon/melee/energy/sword/pirate))
|
||||
icon_state = "cutlass1"
|
||||
else
|
||||
icon_state = "sword[item_color]"
|
||||
w_class = 4
|
||||
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
|
||||
playsound(user, 'sound/weapons/saberon.ogg', 35, 1) //changed it from 50% volume to 35% because deafness
|
||||
user << "<span class='notice'>[src] is now active.</span>"
|
||||
else
|
||||
force = 3
|
||||
throwforce = 5.0
|
||||
hitsound = "swing_hit"
|
||||
attack_verb = null
|
||||
if(istype(src,/obj/item/weapon/melee/energy/sword/pirate))
|
||||
icon_state = "cutlass0"
|
||||
else
|
||||
icon_state = "sword0"
|
||||
w_class = 2
|
||||
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
|
||||
playsound(user, 'sound/weapons/saberoff.ogg', 35, 1) //changed it from 50% volume to 35% because deafness
|
||||
user << "<span class='notice'>[src] can now be concealed.</span>"
|
||||
add_fingerprint(user)
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/attackby(obj/item/weapon/W, mob/living/user)
|
||||
..()
|
||||
if(istype(W, /obj/item/weapon/melee/energy/sword))
|
||||
@@ -160,6 +164,7 @@
|
||||
desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal."
|
||||
icon_state = "blade"
|
||||
force = 70.0//Normal attacks deal very high damage.
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
throwforce = 1//Throwing or dropping the item deletes it.
|
||||
throw_speed = 1
|
||||
throw_range = 1
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
w_class = 3
|
||||
origin_tech = "combat=4"
|
||||
attack_verb = list("flogged", "whipped", "lashed", "disciplined")
|
||||
hitsound = 'sound/weapons/slash.ogg' //pls replace
|
||||
|
||||
/obj/item/weapon/melee/chainofcommand/suicide_act(mob/user)
|
||||
viewers(user) << "<span class='suicide'>[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide.</span>"
|
||||
@@ -40,9 +41,14 @@
|
||||
return
|
||||
add_logs(user, M, "attacked", object="[src.name]")
|
||||
|
||||
if(isrobot(M)) // Don't stun borgs, fix for issue #2436
|
||||
..()
|
||||
return
|
||||
if(!isliving(M)) // Don't stun nonhuman things
|
||||
return
|
||||
|
||||
if(user.a_intent == "harm")
|
||||
if(!..()) return
|
||||
playsound(loc, "swing_hit", 50, 1, -1)
|
||||
if(M.stuttering < 8 && !(HULK in M.mutations))
|
||||
M.stuttering = 8
|
||||
M.Stun(8)
|
||||
|
||||
@@ -66,14 +66,14 @@
|
||||
force = 10
|
||||
icon_state = "eshield[active]"
|
||||
w_class = 4
|
||||
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
|
||||
playsound(user, 'sound/weapons/saberon.ogg', 35, 1)
|
||||
user << "<span class='notice'>[src] is now active.</span>"
|
||||
reflect_chance = 40
|
||||
else
|
||||
force = 3
|
||||
icon_state = "eshield[active]"
|
||||
w_class = 1
|
||||
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
|
||||
playsound(user, 'sound/weapons/saberoff.ogg', 35, 1)
|
||||
user << "<span class='notice'>[src] can now be concealed.</span>"
|
||||
reflect_chance = 0
|
||||
add_fingerprint(user)
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
desc = "A backpack that opens into a localized pocket of Blue Space."
|
||||
origin_tech = "bluespace=4"
|
||||
icon_state = "holdingpack"
|
||||
max_w_class = 4
|
||||
max_combined_w_class = 28
|
||||
max_w_class = 5
|
||||
max_combined_w_class = 35
|
||||
|
||||
New()
|
||||
..()
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
* Mining Satchel
|
||||
* Plant Bag
|
||||
* Sheet Snatcher
|
||||
* Book Bag
|
||||
*
|
||||
* -Sayu
|
||||
*/
|
||||
@@ -245,4 +246,21 @@
|
||||
/obj/item/weapon/storage/bag/sheetsnatcher/borg
|
||||
name = "sheet snatcher 9000"
|
||||
desc = ""
|
||||
capacity = 500//Borgs get more because >specialization
|
||||
capacity = 500//Borgs get more because >specialization
|
||||
|
||||
|
||||
// -----------------------------
|
||||
// Book bag
|
||||
// -----------------------------
|
||||
|
||||
/obj/item/weapon/storage/bag/books
|
||||
name = "book bag"
|
||||
desc = "A bag for books."
|
||||
icon = 'icons/obj/library.dmi'
|
||||
icon_state = "bookbag"
|
||||
display_contents_with_number = 0 //This would look really stupid otherwise
|
||||
storage_slots = 7
|
||||
max_combined_w_class = 21
|
||||
max_w_class = 3
|
||||
w_class = 4 //Bigger than a book because physics
|
||||
can_hold = list("/obj/item/weapon/book", "/obj/item/weapon/spellbook") //No bibles, consistent with bookcase
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
"/obj/item/weapon/wrench",
|
||||
"/obj/item/device/multitool",
|
||||
"/obj/item/device/flashlight",
|
||||
"/obj/item/weapon/cable_coil",
|
||||
"/obj/item/stack/cable_coil",
|
||||
"/obj/item/device/t_scanner",
|
||||
"/obj/item/device/analyzer")
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
new /obj/item/weapon/weldingtool(src)
|
||||
new /obj/item/weapon/crowbar(src)
|
||||
new /obj/item/weapon/wirecutters(src)
|
||||
new /obj/item/weapon/cable_coil(src,30,pick("red","yellow","orange"))
|
||||
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
|
||||
|
||||
|
||||
/obj/item/weapon/storage/belt/utility/atmostech/New()
|
||||
@@ -101,8 +101,11 @@
|
||||
desc = "Can hold security gear like handcuffs and flashes."
|
||||
icon_state = "securitybelt"
|
||||
item_state = "security"//Could likely use a better one.
|
||||
storage_slots = 4
|
||||
storage_slots = 5
|
||||
max_w_class = 3 //Because the baton wouldn't fit otherwise. - Neerti
|
||||
can_hold = list(
|
||||
"/obj/item/weapon/melee/baton",
|
||||
"/obj/item/weapon/melee/classic_baton",
|
||||
"/obj/item/weapon/grenade/flashbang",
|
||||
"/obj/item/weapon/reagent_containers/spray/pepper",
|
||||
"/obj/item/weapon/handcuffs",
|
||||
|
||||
@@ -469,6 +469,13 @@
|
||||
if(istype(W, /obj/item/weapon/match) && W.lit == 0)
|
||||
W.lit = 1
|
||||
W.icon_state = "match_lit"
|
||||
W.damtype = "fire"
|
||||
W.force = 3
|
||||
W.hitsound = 'sound/items/welder.ogg'
|
||||
W.item_state = "cigon"
|
||||
W.name = "lit match"
|
||||
W.desc = "A match. This one is lit."
|
||||
W.attack_verb = list("burnt","singed")
|
||||
processing_objects.Add(W)
|
||||
W.update_icon()
|
||||
return
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
w_class = 4.0
|
||||
origin_tech = "combat=1"
|
||||
attack_verb = list("robusted")
|
||||
hitsound = 'sound/weapons/smash.ogg'
|
||||
|
||||
New()
|
||||
..()
|
||||
@@ -57,12 +58,12 @@
|
||||
new /obj/item/weapon/wirecutters(src)
|
||||
new /obj/item/device/t_scanner(src)
|
||||
new /obj/item/weapon/crowbar(src)
|
||||
new /obj/item/weapon/cable_coil(src,30,color)
|
||||
new /obj/item/weapon/cable_coil(src,30,color)
|
||||
new /obj/item/stack/cable_coil(src,30,color)
|
||||
new /obj/item/stack/cable_coil(src,30,color)
|
||||
if(prob(5))
|
||||
new /obj/item/clothing/gloves/yellow(src)
|
||||
else
|
||||
new /obj/item/weapon/cable_coil(src,30,color)
|
||||
new /obj/item/stack/cable_coil(src,30,color)
|
||||
|
||||
/obj/item/weapon/storage/toolbox/syndicate
|
||||
name = "suspicious looking toolbox"
|
||||
@@ -79,6 +80,6 @@
|
||||
new /obj/item/weapon/wrench(src)
|
||||
new /obj/item/weapon/weldingtool(src)
|
||||
new /obj/item/weapon/crowbar(src)
|
||||
new /obj/item/weapon/cable_coil(src,30,color)
|
||||
new /obj/item/stack/cable_coil(src,30,color)
|
||||
new /obj/item/weapon/wirecutters(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/weapon/storage/box/syndicate/
|
||||
New()
|
||||
..()
|
||||
switch (pickweight(list("bloodyspai" = 1, "stealth" = 1, "screwed" = 1, "guns" = 1, "murder" = 1, "freedom" = 1, "hacker" = 1, "lordsingulo" = 1, "smoothoperator" = 1, "darklord" = 1)))
|
||||
switch (pickweight(list("bloodyspai" = 1, "stealth" = 1, "screwed" = 1, "guns" = 1, "murder" = 1, "freedom" = 1, "hacker" = 1, "lordsingulo" = 1, "darklord" = 1)))
|
||||
if("bloodyspai")
|
||||
new /obj/item/clothing/under/chameleon(src)
|
||||
new /obj/item/clothing/mask/gas/voice(src)
|
||||
@@ -58,16 +58,6 @@
|
||||
new /obj/item/weapon/card/emag(src)
|
||||
return
|
||||
|
||||
if("smoothoperator")
|
||||
new /obj/item/weapon/gun/projectile/automatic/pistol(src)
|
||||
new /obj/item/weapon/silencer(src)
|
||||
new /obj/item/weapon/soap/syndie(src)
|
||||
new /obj/item/weapon/storage/bag/trash(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/clothing/under/suit_jacket(src)
|
||||
new /obj/item/clothing/shoes/laceup(src)
|
||||
return
|
||||
|
||||
if("darklord")
|
||||
new /obj/item/weapon/melee/energy/sword(src)
|
||||
new /obj/item/weapon/melee/energy/sword(src)
|
||||
|
||||
@@ -23,6 +23,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/loaded/New() //this one starts with a cell pre-installed.
|
||||
..()
|
||||
bcell = new(src)
|
||||
@@ -108,9 +112,8 @@
|
||||
|
||||
if(user.a_intent == "harm")
|
||||
..()
|
||||
playsound(loc, "swing_hit", 50, 1, -1)
|
||||
|
||||
else if(!status)
|
||||
if(!status)
|
||||
L.visible_message("<span class='warning'>[L] has been prodded with [src] by [user]. Luckily it was off.</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
icon = 'icons/obj/tank.dmi'
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BACK
|
||||
hitsound = 'sound/weapons/smash.ogg'
|
||||
|
||||
pressure_resistance = ONE_ATMOSPHERE*5
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
g_amt = 0
|
||||
m_amt = 75
|
||||
attack_verb = list("stabbed")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
suicide_act(mob/user)
|
||||
viewers(user) << pick("<span class='suicide'>[user] is stabbing the [src.name] into \his temple! It looks like \he's trying to commit suicide.</span>", \
|
||||
@@ -133,6 +134,7 @@
|
||||
slot_flags = SLOT_BELT
|
||||
force = 3
|
||||
throwforce = 5
|
||||
hitsound = "swing_hit"
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = 2
|
||||
@@ -162,6 +164,22 @@
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/weapon/weldingtool/attack(mob/living/carbon/human/H, mob/user)
|
||||
if(!istype(H))
|
||||
return ..()
|
||||
|
||||
var/obj/item/organ/limb/affecting = H.get_organ(check_zone(user.zone_sel.selecting))
|
||||
|
||||
if(affecting.status == ORGAN_ROBOTIC)
|
||||
if(src.remove_fuel(0))
|
||||
src.item_heal_robotic(H, user, 30, 0)
|
||||
return
|
||||
else
|
||||
user << "<span class='warning'>Need more welding fuel!</span>"
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/weldingtool/process()
|
||||
switch(welding)
|
||||
if(0)
|
||||
@@ -274,10 +292,11 @@
|
||||
user << "<span class='notice'>You switch [src] on.</span>"
|
||||
force = 15
|
||||
damtype = "fire"
|
||||
hitsound = 'sound/items/welder.ogg'
|
||||
icon_state = "welder1"
|
||||
processing_objects.Add(src)
|
||||
else
|
||||
user << "<span class='notice'>Need more fuel.</span>"
|
||||
user << "<span class='notice'>You need more fuel.</span>"
|
||||
welding = 0
|
||||
else
|
||||
if(!message)
|
||||
@@ -286,6 +305,7 @@
|
||||
user << "<span class='notice'>[src] shuts off!</span>"
|
||||
force = 3
|
||||
damtype = "brute"
|
||||
hitsound = "swing_hit"
|
||||
icon_state = "welder"
|
||||
welding = 0
|
||||
|
||||
|
||||
@@ -115,6 +115,32 @@
|
||||
if(!I) return 0
|
||||
return I.IsShield()
|
||||
|
||||
///////////Two hand required objects///////////////
|
||||
//This is for objects that require two hands to even pick up
|
||||
/obj/item/weapon/twohanded/required/
|
||||
w_class = 5.0
|
||||
|
||||
/obj/item/weapon/twohanded/required/attack_self()
|
||||
return
|
||||
|
||||
/obj/item/weapon/twohanded/required/mob_can_equip(M as mob, slot)
|
||||
if(wielded)
|
||||
M << "<span class='warning'>[src.name] is too cumbersome to carry with anything but your hands!</span>"
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/twohanded/required/attack_hand(mob/user)//Can't even pick it up without both hands empty
|
||||
var/obj/item/weapon/twohanded/required/H = user.get_inactive_hand()
|
||||
if(H != null)
|
||||
user.visible_message("<span class='notice'>[src.name] is too cumbersome to carry in one hand!</span>")
|
||||
return
|
||||
var/obj/item/weapon/twohanded/offhand/O = new(user)
|
||||
user.put_in_inactive_hand(O)
|
||||
..()
|
||||
wielded = 1
|
||||
|
||||
|
||||
obj/item/weapon/twohanded/
|
||||
|
||||
/*
|
||||
* Fireaxe
|
||||
@@ -124,11 +150,13 @@
|
||||
name = "fire axe"
|
||||
desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?"
|
||||
force = 5
|
||||
throwforce = 15
|
||||
w_class = 4.0
|
||||
slot_flags = SLOT_BACK
|
||||
force_unwielded = 5
|
||||
force_wielded = 24 // Was 18, Buffed - RobRichards/RR
|
||||
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
/obj/item/weapon/twohanded/fireaxe/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "fireaxe[wielded]"
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
/obj/item/weapon/banhammer/attack(mob/M, mob/user)
|
||||
M << "<font color='red'><b> You have been banned FOR NO REISIN by [user]<b></font>"
|
||||
user << "<font color='red'> You have <b>BANNED</b> [M]</font>"
|
||||
playsound(loc, 'sound/effects/adminhelp.ogg', 15) //keep it at 15% volume so people don't jump out of their skin too much
|
||||
|
||||
|
||||
/obj/item/weapon/nullrod
|
||||
@@ -56,6 +57,7 @@
|
||||
desc = "What are you standing around staring at this for? Get to killing!"
|
||||
icon_state = "claymore"
|
||||
item_state = "claymore"
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
force = 40
|
||||
@@ -70,10 +72,6 @@
|
||||
viewers(user) << "<span class='suicide'>[user] is falling on the [src.name]! It looks like \he's trying to commit suicide.</span>"
|
||||
return(BRUTELOSS)
|
||||
|
||||
/obj/item/weapon/claymore/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/katana
|
||||
name = "katana"
|
||||
desc = "Woefully underpowered in D20"
|
||||
|
||||
@@ -148,7 +148,7 @@
|
||||
return
|
||||
|
||||
/obj/structure/closet/attack_animal(mob/living/simple_animal/user as mob)
|
||||
if(user.wall_smash)
|
||||
if(user.environment_smash)
|
||||
visible_message("\red [user] destroys the [src]. ")
|
||||
for(var/atom/movable/A as mob|obj in src)
|
||||
A.loc = src.loc
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
else if(content_mob == /mob/living/simple_animal/cat)
|
||||
if(prob(50))
|
||||
content_mob = /mob/living/simple_animal/cat/Proc
|
||||
new content_mob(loc)
|
||||
else
|
||||
new content_mob(loc)
|
||||
already_opened = 1
|
||||
|
||||
@@ -50,8 +50,11 @@
|
||||
sleep(2)
|
||||
new /obj/item/weapon/gun/energy/laser/redtag(src)
|
||||
new /obj/item/weapon/gun/energy/laser/redtag(src)
|
||||
new /obj/item/weapon/gun/energy/laser/redtag(src)
|
||||
new /obj/item/clothing/suit/redtag(src)
|
||||
new /obj/item/clothing/suit/redtag(src)
|
||||
new /obj/item/clothing/suit/redtag(src)
|
||||
new /obj/item/clothing/head/helmet/redtaghelm(src)
|
||||
|
||||
|
||||
/obj/structure/closet/lasertag/blue
|
||||
@@ -65,5 +68,8 @@
|
||||
sleep(2)
|
||||
new /obj/item/weapon/gun/energy/laser/bluetag(src)
|
||||
new /obj/item/weapon/gun/energy/laser/bluetag(src)
|
||||
new /obj/item/weapon/gun/energy/laser/bluetag(src)
|
||||
new /obj/item/clothing/suit/bluetag(src)
|
||||
new /obj/item/clothing/suit/bluetag(src)
|
||||
new /obj/item/clothing/suit/bluetag(src)
|
||||
new /obj/item/clothing/suit/bluetag(src)
|
||||
new /obj/item/clothing/head/helmet/bluetaghelm(src)
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
return
|
||||
|
||||
/obj/structure/closet/statue/attack_animal(mob/living/simple_animal/user as mob)
|
||||
if(user.wall_smash)
|
||||
if(user.environment_smash)
|
||||
for(var/mob/M in src)
|
||||
shatter(M)
|
||||
|
||||
|
||||
@@ -125,11 +125,11 @@
|
||||
if(prob(20))
|
||||
new /obj/item/weapon/storage/belt/utility(src)
|
||||
if(prob(30))
|
||||
new /obj/item/weapon/cable_coil/random(src)
|
||||
new /obj/item/stack/cable_coil/random(src)
|
||||
if(prob(30))
|
||||
new /obj/item/weapon/cable_coil/random(src)
|
||||
new /obj/item/stack/cable_coil/random(src)
|
||||
if(prob(30))
|
||||
new /obj/item/weapon/cable_coil/random(src)
|
||||
new /obj/item/stack/cable_coil/random(src)
|
||||
if(prob(20))
|
||||
new /obj/item/device/multitool(src)
|
||||
if(prob(5))
|
||||
|
||||
@@ -330,7 +330,7 @@
|
||||
W.loc = src.loc
|
||||
else if(istype(W, /obj/item/weapon/packageWrap))
|
||||
return
|
||||
else if(istype(W, /obj/item/weapon/cable_coil))
|
||||
else if(istype(W, /obj/item/stack/cable_coil))
|
||||
if(rigged)
|
||||
user << "<span class='notice'>[src] is already rigged!</span>"
|
||||
return
|
||||
|
||||
@@ -438,8 +438,8 @@ obj/structure/door_assembly
|
||||
src.name = "Airlock Assembly"
|
||||
src.anchored = 0
|
||||
|
||||
else if(istype(W, /obj/item/weapon/cable_coil) && state == 0 && anchored )
|
||||
var/obj/item/weapon/cable_coil/coil = W
|
||||
else if(istype(W, /obj/item/stack/cable_coil) && state == 0 && anchored )
|
||||
var/obj/item/stack/cable_coil/coil = W
|
||||
user.visible_message("[user] wires the airlock assembly.", "You start to wire the airlock assembly.")
|
||||
if(do_after(user, 40))
|
||||
if(!src) return
|
||||
@@ -455,7 +455,7 @@ obj/structure/door_assembly
|
||||
if(do_after(user, 40))
|
||||
if(!src) return
|
||||
user << "\blue You've cut the wires from the airlock assembly."
|
||||
new/obj/item/weapon/cable_coil(get_turf(user), 1)
|
||||
new/obj/item/stack/cable_coil(get_turf(user), 1)
|
||||
src.state = 0
|
||||
src.name = "Secured Airlock Assembly"
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user