Merge branch 'master' into upstream-merge-30084

This commit is contained in:
kevinz000
2017-08-29 10:09:13 -07:00
1211 changed files with 66401 additions and 82359 deletions
+2
View File
@@ -14,3 +14,5 @@
#define COMSIG_COMPONENT_ADDED "component_added" //when a component is added to a datum: (datum/component)
#define COMSIG_COMPONENT_REMOVING "component_removing" //before a component is removed from a datum because of RemoveComponent: (datum/component)
#define COMSIG_PARENT_QDELETED "parent_qdeleted" //before a datum's Destroy() is called: ()
#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable, atom)
#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (atom/movable)
+4 -4
View File
@@ -137,10 +137,10 @@
#define isorgan(A) (istype(A, /obj/item/organ))
GLOBAL_LIST_INIT(pointed_types, typecacheof(list(
/obj/item/weapon/pen,
/obj/item/weapon/screwdriver,
/obj/item/weapon/reagent_containers/syringe,
/obj/item/weapon/kitchen/fork)))
/obj/item/pen,
/obj/item/screwdriver,
/obj/item/reagent_containers/syringe,
/obj/item/kitchen/fork)))
#define is_pointed(W) (is_type_in_typecache(W, GLOB.pointed_types))
+4 -6
View File
@@ -97,13 +97,11 @@
#define AI_IDLE 2
#define AI_OFF 3
//determines if a mob can smash through it
#define ENVIRONMENT_SMASH_NONE 0
#define ENVIRONMENT_SMASH_STRUCTURES 1
#define ENVIRONMENT_SMASH_WALLS 2
#define ENVIRONMENT_SMASH_RWALLS 3
#define ENVIRONMENT_SMASH_STRUCTURES 1 //crates, lockers, ect
#define ENVIRONMENT_SMASH_WALLS 2 //walls
#define ENVIRONMENT_SMASH_RWALLS 4 //rwalls
//SNPCs
+2
View File
@@ -42,6 +42,8 @@
#define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run
#define STATUS_EFFECT_GEISTRACKER /datum/status_effect/geis_tracker //if you're using geis, this tracks that and keeps you from using scripture
#define STATUS_EFFECT_MANIAMOTOR /datum/status_effect/maniamotor //disrupts, damages, and confuses the affected as long as they're in range of the motor
#define MAX_MANIA_SEVERITY 100 //how high the mania severity can go
#define MANIA_DAMAGE_TO_CONVERT 90 //how much damage is required before it'll convert affected targets
+1 -2
View File
@@ -97,8 +97,7 @@
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]CHAT: [text]")
/proc/log_sql(text)
if(config.sql_enabled)
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]SQL: [text]")
WRITE_FILE(GLOB.sql_error_log, "\[[time_stamp()]]SQL: [text]")
//This replaces world.log so it displays both in DD and the file
/proc/log_world(text)
+1 -1
View File
@@ -20,7 +20,7 @@
A non null 'fixed_underlay' list var will skip copying the previous turf appearance and always use the list. If the list is
not set properly, the underlay will default to regular floor plating.
To see an example of a diagonal wall, see '/turf/closed/wall/shuttle' and its subtypes.
To see an example of a diagonal wall, see '/turf/closed/wall/mineral/titanium' and its subtypes.
*/
//Redefinitions of the diagonal directions so they can be stored in one var without conflicts
+1 -1
View File
@@ -40,7 +40,7 @@
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && C.z == ZLEVEL_STATION)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(C.loc)
var/obj/item/paper/P = new /obj/item/paper(C.loc)
P.name = "paper - '[title]'"
P.info = text
C.messagetitle.Add("[title]")
+4 -2
View File
@@ -72,7 +72,9 @@
return .
//Splits the text of a file at seperator and returns them in a list.
/world/proc/file2list(filename, seperator="\n")
/world/proc/file2list(filename, seperator="\n", trim = TRUE)
if (trim)
return splittext(trim(file2text(filename)),seperator)
return splittext(file2text(filename),seperator)
//Turns a direction into text
@@ -551,4 +553,4 @@
return /atom
else
return /datum
return text2path(copytext(string_type, 1, last_slash))
return text2path(copytext(string_type, 1, last_slash))
+13 -1
View File
@@ -605,6 +605,18 @@ Turf and target are separate in case you want to teleport some distance from a t
GLOB.sortedAreas.Add(src)
sortTim(GLOB.sortedAreas, /proc/cmp_name_asc)
//Takes: Area type as a text string from a variable.
//Returns: Instance for the area in the world.
/proc/get_area_instance_from_text(areatext)
var/areainstance = null
if(istext(areatext))
areatext = text2path(areatext)
for(var/V in GLOB.sortedAreas)
var/area/A = V
if(A.type == areatext)
areainstance = V
return areainstance
//Takes: Area type as text string or as typepath OR an instance of the area.
//Returns: A list of all areas of that type in the world.
/proc/get_areas(areatype, subtypes=TRUE)
@@ -797,7 +809,7 @@ GLOBAL_LIST_INIT(WALLITEMS, typecacheof(list(
/obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign,
/obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/button,
/obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio/simple_vent_controller,
/obj/item/weapon/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth,
/obj/item/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth,
/obj/structure/mirror, /obj/structure/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment,
/obj/structure/sign/picture_frame
)))
+38 -38
View File
@@ -45,7 +45,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/device/multitool = 2,
/obj/item/device/radio/off = 2,
/obj/item/device/t_scanner = 5,
/obj/item/weapon/airlock_painter = 1,
/obj/item/airlock_painter = 1,
/obj/item/stack/cable_coil/random = 4,
/obj/item/stack/cable_coil/random/five = 6,
/obj/item/stack/medical/bruise_pack = 1,
@@ -56,54 +56,54 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/stack/sheet/metal/twenty = 1,
/obj/item/stack/sheet/mineral/plasma = 1,
/obj/item/stack/sheet/rglass = 1,
/obj/item/weapon/book/manual/wiki/engineering_construction = 1,
/obj/item/weapon/book/manual/wiki/engineering_hacking = 1,
/obj/item/book/manual/wiki/engineering_construction = 1,
/obj/item/book/manual/wiki/engineering_hacking = 1,
/obj/item/clothing/head/cone = 1,
/obj/item/weapon/coin/silver = 1,
/obj/item/weapon/coin/twoheaded = 1,
/obj/item/weapon/poster/random_contraband = 1,
/obj/item/weapon/poster/random_official = 1,
/obj/item/weapon/crowbar = 1,
/obj/item/weapon/crowbar/red = 1,
/obj/item/weapon/extinguisher = 11,
//obj/item/weapon/gun/ballistic/revolver/russian = 1, //disabled until lootdrop is a proper world proc.
/obj/item/weapon/hand_labeler = 1,
/obj/item/weapon/paper/crumpled = 1,
/obj/item/weapon/pen = 1,
/obj/item/weapon/reagent_containers/spray/pestspray = 1,
/obj/item/weapon/reagent_containers/glass/rag = 3,
/obj/item/weapon/stock_parts/cell = 3,
/obj/item/weapon/storage/belt/utility = 2,
/obj/item/weapon/storage/box = 2,
/obj/item/weapon/storage/box/cups = 1,
/obj/item/weapon/storage/box/donkpockets = 1,
/obj/item/weapon/storage/box/lights/mixed = 3,
/obj/item/weapon/storage/box/hug/medical = 1,
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 1,
/obj/item/weapon/storage/toolbox/mechanical = 1,
/obj/item/weapon/screwdriver = 3,
/obj/item/weapon/tank/internals/emergency_oxygen = 2,
/obj/item/weapon/vending_refill/cola = 1,
/obj/item/weapon/weldingtool = 3,
/obj/item/weapon/wirecutters = 1,
/obj/item/weapon/wrench = 4,
/obj/item/weapon/relic = 3,
/obj/item/coin/silver = 1,
/obj/item/coin/twoheaded = 1,
/obj/item/poster/random_contraband = 1,
/obj/item/poster/random_official = 1,
/obj/item/crowbar = 1,
/obj/item/crowbar/red = 1,
/obj/item/extinguisher = 11,
//obj/item/gun/ballistic/revolver/russian = 1, //disabled until lootdrop is a proper world proc.
/obj/item/hand_labeler = 1,
/obj/item/paper/crumpled = 1,
/obj/item/pen = 1,
/obj/item/reagent_containers/spray/pestspray = 1,
/obj/item/reagent_containers/glass/rag = 3,
/obj/item/stock_parts/cell = 3,
/obj/item/storage/belt/utility = 2,
/obj/item/storage/box = 2,
/obj/item/storage/box/cups = 1,
/obj/item/storage/box/donkpockets = 1,
/obj/item/storage/box/lights/mixed = 3,
/obj/item/storage/box/hug/medical = 1,
/obj/item/storage/fancy/cigarettes/dromedaryco = 1,
/obj/item/storage/toolbox/mechanical = 1,
/obj/item/screwdriver = 3,
/obj/item/tank/internals/emergency_oxygen = 2,
/obj/item/vending_refill/cola = 1,
/obj/item/weldingtool = 3,
/obj/item/wirecutters = 1,
/obj/item/wrench = 4,
/obj/item/relic = 3,
/obj/item/weaponcrafting/receiver = 2,
/obj/item/clothing/head/cone = 2,
/obj/item/weapon/grenade/smokebomb = 2,
/obj/item/grenade/smokebomb = 2,
/obj/item/device/geiger_counter = 3,
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange = 1,
/obj/item/reagent_containers/food/snacks/grown/citrus/orange = 1,
/obj/item/device/radio/headset = 1,
/obj/item/device/assembly/infra = 1,
/obj/item/device/assembly/igniter = 2,
/obj/item/device/assembly/signaler = 2,
/obj/item/device/assembly/mousetrap = 2,
/obj/item/weapon/reagent_containers/syringe = 2,
/obj/item/reagent_containers/syringe = 2,
/obj/item/clothing/gloves/color/random = 8,
/obj/item/clothing/shoes/laceup = 1,
/obj/item/weapon/storage/secure/briefcase = 3,
/obj/item/weapon/storage/toolbox/artistic = 2,
/obj/item/storage/secure/briefcase = 3,
/obj/item/storage/toolbox/artistic = 2,
/obj/item/toy/eightball = 1,
/obj/item/weapon/storage/daki = 3,
/obj/item/storage/daki = 3,
"" = 3
))
+1
View File
@@ -6,5 +6,6 @@
#define POLL_IGNORE_ALIEN_LARVA "alien_larva"
#define POLL_IGNORE_CLOCKWORK_MARAUDER "clockwork_marauder"
#define POLL_IGNORE_SYNDICATE "syndicate"
#define POLL_IGNORE_HOLOPARASITE "holoparasite"
GLOBAL_LIST_EMPTY(poll_ignore)
+2
View File
@@ -12,6 +12,8 @@ GLOBAL_VAR(round_id)
GLOBAL_PROTECT(round_id)
GLOBAL_VAR(config_error_log)
GLOBAL_PROTECT(config_error_log)
GLOBAL_VAR(sql_error_log)
GLOBAL_PROTECT(sql_error_log)
GLOBAL_LIST_EMPTY(bombers)
GLOBAL_PROTECT(bombers)
+2 -2
View File
@@ -55,10 +55,10 @@
/obj/item
var/canMouseDown = FALSE
/obj/item/weapon/gun
/obj/item/gun
var/automatic = 0 //can gun use it, 0 is no, anything above 0 is the delay between clicks in ds
/obj/item/weapon/gun/CanItemAutoclick(object, location, params)
/obj/item/gun/CanItemAutoclick(object, location, params)
. = automatic
/atom/proc/IsAutoclickable()
+1 -1
View File
@@ -180,7 +180,7 @@
/atom/proc/CanReachStorage(atom/target,user,depth)
return FALSE
/obj/item/weapon/storage/CanReachStorage(atom/target,user,depth)
/obj/item/storage/CanReachStorage(atom/target,user,depth)
while(target && depth > 0)
target = target.loc
depth--
+1 -1
View File
@@ -13,7 +13,7 @@
if(..())
return
var/mob/living/silicon/robot/R = usr
if(R.module.type != /obj/item/weapon/robot_module)
if(R.module.type != /obj/item/robot_module)
R.hud_used.toggle_show_robot_modules()
return 1
R.pick_module()
+8 -8
View File
@@ -182,8 +182,8 @@
name = "close"
/obj/screen/close/Click()
if(istype(master, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = master
if(istype(master, /obj/item/storage))
var/obj/item/storage/S = master
S.close(usr)
return 1
@@ -262,27 +262,27 @@
to_chat(C, "<span class='warning'>You are not wearing an internals mask!</span>")
return
var/obj/item/I = C.is_holding_item_of_type(/obj/item/weapon/tank)
var/obj/item/I = C.is_holding_item_of_type(/obj/item/tank)
if(I)
to_chat(C, "<span class='notice'>You are now running on internals from the [I] on your [C.get_held_index_name(C.get_held_index_of_item(I))].</span>")
C.internal = I
else if(ishuman(C))
var/mob/living/carbon/human/H = C
if(istype(H.s_store, /obj/item/weapon/tank))
if(istype(H.s_store, /obj/item/tank))
to_chat(H, "<span class='notice'>You are now running on internals from the [H.s_store] on your [H.wear_suit].</span>")
H.internal = H.s_store
else if(istype(H.belt, /obj/item/weapon/tank))
else if(istype(H.belt, /obj/item/tank))
to_chat(H, "<span class='notice'>You are now running on internals from the [H.belt] on your belt.</span>")
H.internal = H.belt
else if(istype(H.l_store, /obj/item/weapon/tank))
else if(istype(H.l_store, /obj/item/tank))
to_chat(H, "<span class='notice'>You are now running on internals from the [H.l_store] in your left pocket.</span>")
H.internal = H.l_store
else if(istype(H.r_store, /obj/item/weapon/tank))
else if(istype(H.r_store, /obj/item/tank))
to_chat(H, "<span class='notice'>You are now running on internals from the [H.r_store] in your right pocket.</span>")
H.internal = H.r_store
//Separate so CO2 jetpacks are a little less cumbersome.
if(!C.internal && istype(C.back, /obj/item/weapon/tank))
if(!C.internal && istype(C.back, /obj/item/tank))
to_chat(C, "<span class='notice'>You are now running on internals from the [C.back] on your back.</span>")
C.internal = C.back
+1 -1
View File
@@ -82,7 +82,7 @@
else
to_chat(user, "[src] has no destination.")
/obj/item/weapon/storage/attack_ghost(mob/user)
/obj/item/storage/attack_ghost(mob/user)
orient2hud(user)
show_to(user)
+1 -1
View File
@@ -57,7 +57,7 @@ GLOBAL_LIST_EMPTY(cock_shapes_icons) //Associated list for names->icon_states fo
GLOBAL_LIST_EMPTY(breasts_size_list)
GLOBAL_LIST_EMPTY(breasts_shapes_list)
GLOBAL_LIST_EMPTY(vagina_shapes_list)
GLOBAL_LIST_INIT(cum_into_containers_list, list(/obj/item/weapon/reagent_containers/food/snacks/pie)) //Yer fuggin snowflake name list jfc
GLOBAL_LIST_INIT(cum_into_containers_list, list(/obj/item/reagent_containers/food/snacks/pie)) //Yer fuggin snowflake name list jfc
GLOBAL_LIST_INIT(dick_nouns, list("dick","cock","member","shaft"))
GLOBAL_LIST_INIT(cum_id_list,"semen")
GLOBAL_LIST_INIT(milk_id_list,"milk")
+5 -5
View File
@@ -287,7 +287,7 @@
setArousalLoss(min_arousal)
/mob/living/carbon/human/proc/mob_fill_container(obj/item/organ/genital/G, obj/item/weapon/reagent_containers/container, mb_time = 30) //For beaker-filling, beware the bartender
/mob/living/carbon/human/proc/mob_fill_container(obj/item/organ/genital/G, obj/item/reagent_containers/container, mb_time = 30) //For beaker-filling, beware the bartender
var/total_fluids = 0
var/datum/reagents/fluid_source = null
@@ -368,11 +368,11 @@
return input(src, "With whom?", "Sexual partner", null) in partners //pick one, default to null
/mob/living/carbon/human/proc/pick_climax_container()
var/obj/item/weapon/reagent_containers/SC = null
var/obj/item/reagent_containers/SC = null
var/list/containers_list = list()
for(var/obj/item/weapon/reagent_containers/container in held_items)
if(container.is_open_container() || istype(container, /obj/item/weapon/reagent_containers/food/snacks))
for(var/obj/item/reagent_containers/container in held_items)
if(container.is_open_container() || istype(container, /obj/item/reagent_containers/food/snacks))
containers_list += container
if(containers_list.len)
@@ -530,7 +530,7 @@
picked_organ = pick_climax_genitals() //Gotta be climaxable, not just masturbation, to fill with fluids.
if(picked_organ)
//Good, got an organ, time to pick a container
var/obj/item/weapon/reagent_containers/fluid_container = pick_climax_container()
var/obj/item/reagent_containers/fluid_container = pick_climax_container()
if(fluid_container)
mob_fill_container(picked_organ, fluid_container)
return
+3 -3
View File
@@ -1,9 +1,9 @@
//Will include consumable gene mods in the future.
/obj/item/weapon/genemod
/obj/item/genemod
name = "genetic modifier"
desc = "Microbodies which can grow, morph, or otherwise change an organism into something else."
icon = 'icons/obj/items.dmi'
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "dnainjector"
throw_speed = 3
throw_range = 5
@@ -18,5 +18,5 @@
var/used = 0
/obj/item/weapon/genemod/proc/use(mob/living/carbon/human/target)
/obj/item/genemod/proc/use(mob/living/carbon/human/target)
return
+5 -5
View File
@@ -1,4 +1,4 @@
/obj/item/weapon/gun/energy/laser/carbine
/obj/item/gun/energy/laser/carbine
name = "laser carbine"
desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal laser gun."
icon = 'icons/obj/guns/cit_guns.dmi'
@@ -8,13 +8,13 @@
force = 10
throwforce = 10
ammo_type = list(/obj/item/ammo_casing/energy/lasergun)
cell_type = /obj/item/weapon/stock_parts/cell/lascarbine
cell_type = /obj/item/stock_parts/cell/lascarbine
resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/weapon/gun/energy/laser/carbine/nopin
/obj/item/gun/energy/laser/carbine/nopin
pin = null
/obj/item/weapon/stock_parts/cell/lascarbine
/obj/item/stock_parts/cell/lascarbine
name = "laser carbine power supply"
maxcharge = 2500
@@ -25,5 +25,5 @@
req_tech = list("combat" = 5, "magnets" = 5, "powerstorage" = 4)
build_type = PROTOLATHE
materials = list(MAT_GOLD = 2500, MAT_METAL = 5000, MAT_GLASS = 5000)
build_path = /obj/item/weapon/gun/energy/laser/carbine/nopin
build_path = /obj/item/gun/energy/laser/carbine/nopin
category = list("Weapons")
+11 -11
View File
@@ -13,15 +13,15 @@
/obj/item/clothing/under/maid = 5,
/obj/item/clothing/under/stripper_pink = 5,
/obj/item/clothing/under/stripper_green = 5,
/obj/item/weapon/dildo/custom = 5
/obj/item/dildo/custom = 5
)
contraband = list(/obj/item/weapon/restraints/handcuffs/fake/kinky = 5,
contraband = list(/obj/item/restraints/handcuffs/fake/kinky = 5,
/obj/item/clothing/neck/petcollar = 5,
/obj/item/clothing/under/mankini = 1,
/obj/item/weapon/dildo/flared/huge = 1
/obj/item/dildo/flared/huge = 1
)
premium = list()
refill_canister = /obj/item/weapon/vending_refill/kink
refill_canister = /obj/item/vending_refill/kink
/obj/machinery/vending/nazivend
name = "Nazivend"
@@ -42,11 +42,11 @@
/obj/item/clothing/suit/officercoat = 10,
/obj/item/clothing/under/officeruniform = 10,
/obj/item/clothing/suit/space/hardsuit/nazi = 3,
/obj/item/weapon/gun/energy/plasma/MP40k = 4
/obj/item/gun/energy/plasma/MP40k = 4
)
premium = list()
refill_canister = /obj/item/weapon/vending_refill/nazi
refill_canister = /obj/item/vending_refill/nazi
/obj/machinery/vending/sovietvend
name = "KomradeVendtink"
@@ -70,11 +70,11 @@
/obj/item/clothing/suit/russofurcoat = 4,
/obj/item/clothing/head/russofurhat = 4,
/obj/item/clothing/suit/space/hardsuit/soviet = 3,
/obj/item/weapon/gun/energy/laser/LaserAK = 4
/obj/item/gun/energy/laser/LaserAK = 4
)
premium = list()
refill_canister = /obj/item/weapon/vending_refill/soviet
refill_canister = /obj/item/vending_refill/soviet
#undef STANDARD_CHARGE
@@ -82,19 +82,19 @@
#undef COIN_CHARGE
/obj/item/weapon/vending_refill/kink
/obj/item/vending_refill/kink
machine_name = "KinkMate"
icon_state = "refill_kink"
charges = list(8, 5, 0)// of 20 standard, 12 contraband, 0 premium
init_charges = list(8, 5, 0)
/obj/item/weapon/vending_refill/nazi
/obj/item/vending_refill/nazi
machine_name = "nazivend"
icon_state = "refill_nazi"
charges = list(33, 13, 0)
init_charges = list(33, 13, 0)
/obj/item/weapon/vending_refill/soviet
/obj/item/vending_refill/soviet
machine_name = "sovietvend"
icon_state = "refill_soviet"
charges = list(47, 7, 0)
+34 -34
View File
@@ -1,42 +1,42 @@
/obj/item/weapon/robot_module/loader
/obj/item/robot_module/loader
name = "loader robot module"
/obj/item/weapon/robot_module/loader/New()
/obj/item/robot_module/loader/New()
..()
emag = new /obj/item/borg/stun(src)
modules += new /obj/item/weapon/extinguisher(src)
modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
modules += new /obj/item/weapon/screwdriver(src)
modules += new /obj/item/weapon/wrench(src)
modules += new /obj/item/weapon/crowbar(src)
modules += new /obj/item/weapon/wirecutters(src)
modules += new /obj/item/extinguisher(src)
modules += new /obj/item/weldingtool/largetank/cyborg(src)
modules += new /obj/item/screwdriver(src)
modules += new /obj/item/wrench(src)
modules += new /obj/item/crowbar(src)
modules += new /obj/item/wirecutters(src)
modules += new /obj/item/device/multitool(src)
modules += new /obj/item/device/t_scanner(src)
modules += new /obj/item/device/analyzer(src)
modules += new /obj/item/device/assembly/signaler
modules += new /obj/item/weapon/soap/nanotrasen(src)
modules += new /obj/item/soap/nanotrasen(src)
fix_modules()
/obj/item/weapon/robot_module/k9
/obj/item/robot_module/k9
name = "Security K-9 Unit module"
/obj/item/weapon/robot_module/k9/New()
/obj/item/robot_module/k9/New()
..()
modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg/dog(src)
modules += new /obj/item/weapon/dogborg/jaws/big(src)
modules += new /obj/item/weapon/dogborg/pounce(src)
modules += new /obj/item/restraints/handcuffs/cable/zipties/cyborg/dog(src)
modules += new /obj/item/dogborg/jaws/big(src)
modules += new /obj/item/dogborg/pounce(src)
modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src)
modules += new /obj/item/weapon/soap/tongue(src)
modules += new /obj/item/soap/tongue(src)
modules += new /obj/item/device/analyzer/nose(src)
modules += new /obj/item/weapon/storage/bag/borgdelivery(src)
modules += new /obj/item/storage/bag/borgdelivery(src)
//modules += new /obj/item/device/assembly/signaler(src)
//modules += new /obj/item/device/detective_scanner(src)
modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src)
emag = new /obj/item/weapon/gun/energy/laser/cyborg(src)
modules += new /obj/item/gun/energy/disabler/cyborg(src)
emag = new /obj/item/gun/energy/laser/cyborg(src)
fix_modules()
/obj/item/weapon/robot_module/security/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
/obj/item/robot_module/security/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
..()
var/obj/item/weapon/gun/energy/gun/advtaser/cyborg/T = locate(/obj/item/weapon/gun/energy/gun/advtaser/cyborg) in get_usable_modules()
var/obj/item/gun/energy/gun/advtaser/cyborg/T = locate(/obj/item/gun/energy/gun/advtaser/cyborg) in get_usable_modules()
if(T)
if(T.power_supply.charge < T.power_supply.maxcharge)
var/obj/item/ammo_casing/energy/S = T.ammo_type[T.select]
@@ -46,31 +46,31 @@
T.charge_tick = 0
fix_modules()
/obj/item/weapon/robot_module/borgi
/obj/item/robot_module/borgi
name = "Borgi module"
/obj/item/weapon/robot_module/borgi/New()
/obj/item/robot_module/borgi/New()
..()
modules += new /obj/item/weapon/dogborg/jaws/small(src)
modules += new /obj/item/weapon/storage/bag/borgdelivery(src)
modules += new /obj/item/weapon/soap/tongue(src)
modules += new /obj/item/dogborg/jaws/small(src)
modules += new /obj/item/storage/bag/borgdelivery(src)
modules += new /obj/item/soap/tongue(src)
modules += new /obj/item/device/healthanalyzer(src)
modules += new /obj/item/device/analyzer/nose(src)
emag = new /obj/item/weapon/dogborg/pounce(src)
emag = new /obj/item/dogborg/pounce(src)
fix_modules()
/obj/item/weapon/robot_module/medihound
/obj/item/robot_module/medihound
name = "MediHound module"
/obj/item/weapon/robot_module/medihound/New()
/obj/item/robot_module/medihound/New()
..()
modules += new /obj/item/weapon/dogborg/jaws/small(src)
modules += new /obj/item/weapon/storage/bag/borgdelivery(src)
modules += new /obj/item/dogborg/jaws/small(src)
modules += new /obj/item/storage/bag/borgdelivery(src)
modules += new /obj/item/device/analyzer/nose(src)
modules += new /obj/item/weapon/soap/tongue(src)
modules += new /obj/item/soap/tongue(src)
modules += new /obj/item/device/healthanalyzer(src)
modules += new /obj/item/weapon/dogborg/sleeper(src)
modules += new /obj/item/weapon/twohanded/shockpaddles/hound(src)
modules += new /obj/item/dogborg/sleeper(src)
modules += new /obj/item/twohanded/shockpaddles/hound(src)
modules += new /obj/item/device/sensor_device(src)
emag = new /obj/item/weapon/dogborg/pounce(src)
emag = new /obj/item/dogborg/pounce(src)
fix_modules()
+80 -56
View File
@@ -1,4 +1,4 @@
/obj/item/weapon/dogborg/jaws/big
/obj/item/dogborg/jaws/big
name = "combat jaws"
icon = 'icons/mob/dogborg.dmi'
icon_state = "jaws"
@@ -11,7 +11,7 @@
w_class = 3
sharpness = IS_SHARP
/obj/item/weapon/dogborg/jaws/small
/obj/item/dogborg/jaws/small
name = "puppy jaws"
icon = 'icons/mob/dogborg.dmi'
icon_state = "smalljaws"
@@ -25,11 +25,11 @@
sharpness = IS_SHARP
var/emagged = 0
/obj/item/weapon/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user)
/obj/item/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user)
..()
user.do_attack_animation(A, ATTACK_EFFECT_BITE)
/obj/item/weapon/dogborg/jaws/small/attack_self(mob/user)
/obj/item/dogborg/jaws/small/attack_self(mob/user)
var/mob/living/silicon/robot.R = user
if(R.emagged)
emagged = !emagged
@@ -62,20 +62,20 @@
//Cuffs
/obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg/dog/attack(mob/living/carbon/C, mob/user)
/obj/item/restraints/handcuffs/cable/zipties/cyborg/dog/attack(mob/living/carbon/C, mob/user)
if(!C.handcuffed)
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
C.visible_message("<span class='danger'>[user] is trying to put zipties on [C]!</span>", \
"<span class='userdanger'>[user] is trying to put zipties on [C]!</span>")
if(do_mob(user, C, 30))
if(!C.handcuffed)
C.handcuffed = new /obj/item/weapon/restraints/handcuffs/cable/zipties/used(C)
C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
C.update_inv_handcuffed(0)
user << "<span class='notice'>You handcuff [C].</span>"
to_chat(user,"<span class='notice'>You handcuff [C].</span>")
playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0)
add_logs(user, C, "handcuffed")
else
user << "<span class='warning'>You fail to handcuff [C]!</span>"
to_chat(user,"<span class='warning'>You fail to handcuff [C]!</span>")
//Boop
@@ -149,7 +149,7 @@
//Delivery
/obj/item/weapon/storage/bag/borgdelivery
/obj/item/storage/bag/borgdelivery
name = "fetching storage"
desc = "Fetch the thing!"
icon = 'icons/mob/dogborg.dmi'
@@ -161,12 +161,12 @@
storage_slots = 1
collection_mode = 0
can_hold = list() // any
cant_hold = list(/obj/item/weapon/disk/nuclear)
cant_hold = list(/obj/item/disk/nuclear)
//Tongue stuff
/obj/item/weapon/soap/tongue
/obj/item/soap/tongue
name = "synthetic tongue"
desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
icon = 'icons/mob/dogborg.dmi'
@@ -175,7 +175,7 @@
cleanspeed = 80
var/emagged = 0
/obj/item/weapon/soap/tongue/New()
/obj/item/soap/tongue/New()
..()
flags_1 |= NOBLUDGEON_1 //No more attack messages
@@ -185,7 +185,7 @@
icon = 'icons/mob/dogborg.dmi'
icon_state= "kibble"
/obj/item/weapon/soap/tongue/attack_self(mob/user)
/obj/item/soap/tongue/attack_self(mob/user)
var/mob/living/silicon/robot.R = user
if(R.emagged)
emagged = !emagged
@@ -203,15 +203,17 @@
cleanspeed = 80
update_icon()
/obj/item/weapon/soap/tongue/afterattack(atom/target, mob/user, proximity)
/obj/item/soap/tongue/afterattack(atom/target, mob/user, proximity)
if(!proximity || !check_allowed_items(target))
return
if(user.client && (target in user.client.screen))
user << "<span class='warning'>You need to take that [target.name] off before cleaning it!</span>"
to_chat(user, "<span class='warning'>You need to take that [target.name] off before cleaning it!</span>")
else if(istype(target,/obj/effect/decal/cleanable))
user.visible_message("[user] begins to lick off \the [target.name].", "<span class='warning'>You begin to lick off \the [target.name]...</span>")
if(do_after(user, src.cleanspeed, target = target))
user << "<span class='notice'>You finish licking off \the [target.name].</span>"
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them.
to_chat(user, "<span class='notice'>You finish licking off \the [target.name].</span>")
qdel(target)
var/mob/living/silicon/robot.R = user
R.cell.give(50)
@@ -219,17 +221,21 @@
if(istype(target,/obj/item/trash))
user.visible_message("[user] nibbles away at \the [target.name].", "<span class='warning'>You begin to nibble away at \the [target.name]...</span>")
if(do_after(user, src.cleanspeed, target = target))
user << "<span class='notice'>You finish off \the [target.name].</span>"
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them.
to_chat(user, "<span class='notice'>You finish off \the [target.name].</span>")
qdel(target)
var/mob/living/silicon/robot.R = user
R.cell.give(250)
return
if(istype(target,/obj/item/weapon/stock_parts/cell))
if(istype(target,/obj/item/stock_parts/cell))
user.visible_message("[user] begins cramming \the [target.name] down its throat.", "<span class='warning'>You begin cramming \the [target.name] down your throat...</span>")
if(do_after(user, 50, target = target))
user << "<span class='notice'>You finish off \the [target.name].</span>"
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them.
to_chat(user, "<span class='notice'>You finish off \the [target.name].</span>")
var/mob/living/silicon/robot.R = user
var/obj/item/weapon/stock_parts/cell.C = target
var/obj/item/stock_parts/cell.C = target
R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf
qdel(target)
return
@@ -237,15 +243,19 @@
if(!I.anchored && src.emagged)
user.visible_message("[user] begins chewing up \the [target.name]. Looks like it's trying to loophole around its diet restriction!", "<span class='warning'>You begin chewing up \the [target.name]...</span>")
if(do_after(user, 100, target = I)) //Nerf dat time yo
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. Even emags don't make you magically eat things at range.
return //If they moved away, you can't eat them.
visible_message("<span class='warning'>[user] chews up \the [target.name] and cleans off the debris!</span>")
user << "<span class='notice'>You finish off \the [target.name].</span>"
to_chat(user, "<span class='notice'>You finish off \the [target.name].</span>")
qdel(I)
var/mob/living/silicon/robot.R = user
R.cell.give(500)
return
user.visible_message("[user] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
if(do_after(user, src.cleanspeed, target = target))
user << "<span class='notice'>You clean \the [target.name].</span>"
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't clean them.
to_chat(user,"<span class='notice'>You clean \the [target.name].</span>")
var/obj/effect/decal/cleanable/C = locate() in target
qdel(C)
target.clean_blood()
@@ -269,12 +279,16 @@
else if(istype(target, /obj/structure/window))
user.visible_message("[user] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
if(do_after(user, src.cleanspeed, target = target))
user << "<span class='notice'>You clean \the [target.name].</span>"
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't clean them.
to_chat(user, "<span class='notice'>You clean \the [target.name].</span>")
target.color = initial(target.color)
else
user.visible_message("[user] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
if(do_after(user, src.cleanspeed, target = target))
user << "<span class='notice'>You clean \the [target.name].</span>"
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't clean them.
to_chat(user, "<span class='notice'>You clean \the [target.name].</span>")
var/obj/effect/decal/cleanable/C = locate() in target
qdel(C)
target.clean_blood()
@@ -284,7 +298,7 @@
//Defibs
/obj/item/weapon/twohanded/shockpaddles/hound
/obj/item/twohanded/shockpaddles/hound
name = "defibrillator paws"
desc = "MediHound specific shock paws."
icon = 'icons/mob/dogborg.dmi'
@@ -293,7 +307,7 @@
req_defib = 0
wielded = 1
/obj/item/weapon/twohanded/shockpaddles/hound/attack(mob/M, mob/user)
/obj/item/twohanded/shockpaddles/hound/attack(mob/M, mob/user)
var/mob/living/silicon/robot.R = user
if(R.cell.charge < 1000)
user.visible_message("<span class='warning'>You don't have enough charge for this operation!</span class>")
@@ -322,17 +336,17 @@
var/eject_port = "ingestion"
var/list/items_preserved = list()
var/list/important_items = list(
/obj/item/weapon/hand_tele,
/obj/item/weapon/card/id/captains_spare,
/obj/item/hand_tele,
/obj/item/card/id/captains_spare,
/obj/item/device/aicard,
/obj/item/device/paicard,
/obj/item/weapon/gun,
/obj/item/weapon/pinpointer,
/obj/item/gun,
/obj/item/pinpointer,
/obj/item/clothing/shoes/magboots,
/obj/item/clothing/head/helmet/space,
/obj/item/clothing/suit/space,
/obj/item/weapon/reagent_containers/hypospray/CMO,
/obj/item/weapon/tank/jetpack/oxygen/captain,
/obj/item/reagent_containers/hypospray/CMO,
/obj/item/tank/jetpack/oxygen/captain,
/obj/item/clothing/accessory/medal/gold/captain,
/obj/item/clothing/suit/armor,
/obj/item/documents,
@@ -340,7 +354,7 @@
/obj/item/nuke_core_container,
/obj/item/areaeditor/blueprints,
/obj/item/documents/syndicate,
/obj/item/weapon/disk/nuclear)
/obj/item/disk/nuclear)
/obj/item/device/dogborg/sleeper/New()
..()
@@ -355,16 +369,20 @@
return
if(!ishuman(target))
return
if(!target.devourable)
to_chat(user, "<span class='warning'>This person is incompatible with our equipment.</span>")
return
if(target.buckled)
user << "<span class='warning'>The user is buckled and can not be put into your [src.name].</span>"
to_chat(user, "<span class='warning'>The user is buckled and can not be put into your [src.name].</span>")
return
if(patient)
user << "<span class='warning'>Your [src.name] is already occupied.</span>"
to_chat(user, "<span class='warning'>Your [src.name] is already occupied.</span>")
return
user.visible_message("<span class='warning'>[hound.name] is ingesting [target.name] into their [src.name].</span>", "<span class='notice'>You start ingesting [target] into your [src]...</span>")
if(!patient && ishuman(target) && !target.buckled && do_after (user, 50, target))
if(!patient && ishuman(target) && !target.buckled && do_after (user, 50, target = target))
if(!proximity) return //If they moved away, you can't eat them.
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them.
if(patient) return //If you try to eat two people at once, you can only eat one.
@@ -526,7 +544,7 @@
START_PROCESSING(SSobj, src)
sleeperUI(usr)
if(patient)
patient << "<span class='danger'>[hound.name]'s [src.name] fills with caustic enzymes around you!</span>"
to_chat(patient, "<span class='danger'>[hound.name]'s [src.name] fills with caustic enzymes around you!</span>")
return
if(cleaning)
sleeperUI(usr)
@@ -544,9 +562,9 @@
if(href_list["inject"] == "epinephrine" || patient.health > min_health)
inject_chem(usr, href_list["inject"])
else
usr << "<span class='notice'>ERROR: Subject is not in stable condition for injections.</span>"
to_chat(usr, "<span class='notice'>ERROR: Subject is not in stable condition for injections.</span>")
else
usr << "<span class='notice'>ERROR: Subject cannot metabolise chemicals.</span>"
to_chat(usr,"<span class='notice'>ERROR: Subject cannot metabolise chemicals.</span>")
src.updateUsrDialog()
sleeperUI(usr) //Needs a callback to boop the page to refresh.
@@ -556,15 +574,15 @@
if(patient && patient.reagents)
if(chem in injection_chems + "epinephrine")
if(hound.cell.charge < 800) //This is so borgs don't kill themselves with it.
hound << "<span class='notice'>You don't have enough power to synthesize fluids.</span>"
to_chat(hound, "<span class='notice'>You don't have enough power to synthesize fluids.</span>")
return
else if(patient.reagents.get_reagent_amount(chem) + 10 >= 20) //Preventing people from accidentally killing themselves by trying to inject too many chemicals!
hound << "<span class='notice'>Your stomach is currently too full of fluids to secrete more fluids of this kind.</span>"
to_chat(hound, "<span class='notice'>Your stomach is currently too full of fluids to secrete more fluids of this kind.</span>")
else if(patient.reagents.get_reagent_amount(chem) + 10 <= 20) //No overdoses for you
patient.reagents.add_reagent(chem, inject_amount)
drain(750) //-750 charge per injection
var/units = round(patient.reagents.get_reagent_amount(chem))
hound << "<span class='notice'>Injecting [units] unit\s of [injection_chems[chem]] into occupant.</span>" //If they were immersed, the reagents wouldn't leave with them.
to_chat(hound, "<span class='notice'>Injecting [units] unit\s of [injection_chems[chem]] into occupant.</span>") //If they were immersed, the reagents wouldn't leave with them.
/obj/item/device/dogborg/sleeper/process()
@@ -651,7 +669,7 @@
//Belly is entirely empty
if(!length(contents))
hound << "<span class='notice'>Your [src.name] is now clean. Ending self-cleaning cycle.</span>"
to_chat(hound, "<span class='notice'>Your [src.name] is now clean. Ending self-cleaning cycle.</span>")
cleaning = 0
update_patient()
return
@@ -716,8 +734,8 @@
qdel(T)
//Special case for IDs to make them digested
//else if (istype(T, /obj/item/weapon/card/id))
//var/obj/item/weapon/card/id/ID = T
//else if (istype(T, /obj/item/card/id))
//var/obj/item/card/id/ID = T
//ID.digest() //Need the digest proc, first.
//Anything not perserved, PDA, or ID
@@ -742,7 +760,7 @@
min_health = -100
injection_chems = null //So they don't have all the same chems as the medihound!
/obj/item/weapon/storage/attackby(obj/item/device/dogborg/sleeper/K9, mob/user, proximity)
/obj/item/storage/attackby(obj/item/device/dogborg/sleeper/K9, mob/user, proximity)
K9.afterattack(src, user ,1)
/obj/item/device/dogborg/sleeper/K9/afterattack(var/atom/movable/target, mob/living/silicon/user, proximity)
@@ -766,12 +784,14 @@
to_chat(user,"<span class='warning'>[brigman] is buckled and can not be put into your [src.name].</span>")
return
user.visible_message("<span class='warning'>[hound.name] is ingesting [brigman] into their [src.name].</span>", "<span class='notice'>You start ingesting [brigman] into your [src.name]...</span>")
if(do_after(user, 30, brigman) && !patient && !brigman.buckled)
if(do_after(user, 30, target = brigman) && !patient && !brigman.buckled)
if(!in_range(src, brigman)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them.
brigman.forceMove(src)
brigman.reset_perspective(src)
update_patient()
START_PROCESSING(SSobj, src)
user.visible_message("<span class='warning'>[hound.name]'s mobile brig clunks in series as [brigman] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [brigman] slips inside.</span>")
user.visible_message("<span class='warning'>[hound.name]'s mobile brig clunks in series as [brigman] slips inside.</span>", "<span class='notice'>Your mobile brig groans lightly as [brigman] slips inside.</span>")
playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) // Really don't need ERP sound effects for robots
return
return
@@ -786,7 +806,7 @@
injection_chems = null //So they don't have all the same chems as the medihound!
var/max_item_count = 32
/obj/item/weapon/storage/attackby(obj/item/device/dogborg/sleeper/compactor, mob/user, proximity) //GIT CIRCUMVENTED YO!
/obj/item/storage/attackby(obj/item/device/dogborg/sleeper/compactor, mob/user, proximity) //GIT CIRCUMVENTED YO!
compactor.afterattack(src, user ,1)
/obj/item/device/dogborg/sleeper/compactor/afterattack(var/atom/movable/target, mob/living/silicon/user, proximity)//GARBO NOMS
@@ -810,7 +830,9 @@
to_chat(user,"<span class='warning'>\The [target] is too large to fit into your [src.name]</span>")
return
user.visible_message("<span class='warning'>[hound.name] is ingesting [target.name] into their [src.name].</span>", "<span class='notice'>You start ingesting [target] into your [src.name]...</span>")
if(do_after(user, 30, target) && length(contents) < max_item_count)
if(do_after(user, 30, target = target) && length(contents) < max_item_count)
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them. This still applies to items, don't magically eat things I picked up already.
target.forceMove(src)
user.visible_message("<span class='warning'>[hound.name]'s garbage processor groans lightly as [target.name] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [target] slips inside.</span>")
playsound(hound, 'sound/machines/disposalflush.ogg', 50, 1)
@@ -822,7 +844,7 @@
else if(ishuman(target))
var/mob/living/carbon/human/trashman = target
if (!trashman.devourable)
to_chat(user, "The target registers an error code.")
to_chat(user, "<span class='warning'>\The [target] registers an error code to your [src.name]</span>")
return
if(patient)
to_chat(user,"<span class='warning'>Your [src.name] is already occupied.</span>")
@@ -831,7 +853,9 @@
to_chat(user,"<span class='warning'>[trashman] is buckled and can not be put into your [src.name].</span>")
return
user.visible_message("<span class='warning'>[hound.name] is ingesting [trashman] into their [src.name].</span>", "<span class='notice'>You start ingesting [trashman] into your [src.name]...</span>")
if(do_after(user, 30, trashman) && !patient && !trashman.buckled && length(contents) < max_item_count)
if(do_after(user, 30, target = trashman) && !patient && !trashman.buckled && length(contents) < max_item_count)
if(!in_range(src, trashman)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them.
trashman.forceMove(src)
trashman.reset_perspective(src)
update_patient()
@@ -844,7 +868,7 @@
// Pounce stuff for K-9
/obj/item/weapon/dogborg/pounce
/obj/item/dogborg/pounce
name = "pounce"
icon = 'icons/mob/dogborg.dmi'
icon_state = "pounce"
@@ -852,7 +876,7 @@
force = 0
throwforce = 0
/obj/item/weapon/dogborg/pounce/New()
/obj/item/dogborg/pounce/New()
..()
flags_1 |= NOBLUDGEON_1
@@ -868,7 +892,7 @@
#define MAX_K9_LEAP_DIST 4 //because something's definitely borked the pounce functioning from a distance.
/obj/item/weapon/dogborg/pounce/afterattack(atom/A, mob/user)
/obj/item/dogborg/pounce/afterattack(atom/A, mob/user)
var/mob/living/silicon/robot.R = user
R.leap_at(A)
+2 -2
View File
@@ -90,7 +90,7 @@
icon = 'icons/mob/pokemon.dmi'
var/pokeball
pixel_x = -16
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab = 5)
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 5)
ventcrawler = 2
health = 100
maxHealth = 100
@@ -132,7 +132,7 @@
/mob/living/simple_animal/pokemon/leg
icon = 'icons/mob/legendary.dmi'
pixel_x = -32
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab = 12)
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 12)
health = 200
maxHealth = 200
+13 -13
View File
@@ -1,7 +1,7 @@
//////////
//DILDOS//
//////////
obj/item/weapon/dildo
obj/item/dildo
name = "dildo"
desc = "Floppy!"
icon = 'code/citadel/icons/dildo.dmi'
@@ -19,7 +19,7 @@ obj/item/weapon/dildo
var/random_shape = FALSE
//Lists moved to _cit_helpers.dm as globals so they're not instanced individually
obj/item/weapon/dildo/proc/update_appearance()
obj/item/dildo/proc/update_appearance()
icon_state = "[dildo_type]_[dildo_shape]_[dildo_size]"
var/sizeword = ""
switch(dildo_size)
@@ -34,7 +34,7 @@ obj/item/weapon/dildo/proc/update_appearance()
name = "[sizeword][dildo_shape] [can_customize ? "custom " : ""][dildo_type]"
obj/item/weapon/dildo/AltClick(mob/living/user)
obj/item/dildo/AltClick(mob/living/user)
if(QDELETED(src))
return
if(!isliving(user))
@@ -45,7 +45,7 @@ obj/item/weapon/dildo/AltClick(mob/living/user)
return
customize(user)
obj/item/weapon/dildo/proc/customize(mob/living/user)
obj/item/dildo/proc/customize(mob/living/user)
if(!can_customize)
return FALSE
if(src && !user.incapacitated() && in_range(user,src))
@@ -74,7 +74,7 @@ obj/item/weapon/dildo/proc/customize(mob/living/user)
update_appearance()
return TRUE
obj/item/weapon/dildo/Initialize()
obj/item/dildo/Initialize()
. = ..()
if(random_color == TRUE)
var/randcolor = pick(GLOB.dildo_colors)
@@ -90,40 +90,40 @@ obj/item/weapon/dildo/Initialize()
pixel_y = rand(-7,7)
pixel_x = rand(-7,7)
obj/item/weapon/dildo/examine(mob/user)
obj/item/dildo/examine(mob/user)
..()
if(can_customize)
user << "<span class='notice'>Alt-Click \the [src.name] to customize it.</span>"
obj/item/weapon/dildo/random//totally random
obj/item/dildo/random//totally random
name = "random dildo"//this name will show up in vendors and shit so you know what you're vending(or don't, i guess :^))
random_color = TRUE
random_shape = TRUE
random_size = TRUE
obj/item/weapon/dildo/knotted
obj/item/dildo/knotted
dildo_shape = "knotted"
name = "knotted dildo"
obj/item/weapon/dildo/human
obj/item/dildo/human
dildo_shape = "human"
name = "human dildo"
obj/item/weapon/dildo/plain
obj/item/dildo/plain
dildo_shape = "plain"
name = "plain dildo"
obj/item/weapon/dildo/flared
obj/item/dildo/flared
dildo_shape = "flared"
name = "flared dildo"
obj/item/weapon/dildo/flared/huge
obj/item/dildo/flared/huge
name = "literal horse cock"
desc = "THIS THING IS HUGE!"
dildo_size = 4
obj/item/weapon/dildo/custom
obj/item/dildo/custom
name = "customizable dildo"
desc = "Thanks to significant advances in synthetic nanomaterials, this dildo is capable of taking on many different forms to fit the user's preferences! Pricy!"
can_customize = TRUE
+2 -2
View File
@@ -68,14 +68,14 @@
/**
* Employee reassignment hook.
* Called in card.dm when someone's card is reassigned at the HoP's desk.
* Parameters: var/obj/item/weapon/card/id
* Parameters: var/obj/item/card/id
*/
/hook/reassign_employee
/**
* Employee terminated hook.
* Called in card.dm when someone's card is terminated at the HoP's desk.
* Parameters: var/obj/item/weapon/card/id
* Parameters: var/obj/item/card/id
*/
/hook/terminate_employee
+8 -10
View File
@@ -253,16 +253,14 @@ SUBSYSTEM_DEF(blackbox)
/datum/feedback_variable/proc/get_variable()
return variable
/datum/feedback_variable/proc/set_details(text)
if (istext(text))
details = text
/datum/feedback_variable/proc/add_details(text)
if (istext(text))
if (!details)
details = "\"[text]\""
else
details += " | \"[text]\""
/datum/feedback_variable/proc/set_details(deets)
details = "\"[deets]\""
/datum/feedback_variable/proc/add_details(deets)
if (!details)
set_details(deets)
else
details += " | \"[deets]\""
/datum/feedback_variable/proc/get_details()
return details
+2 -2
View File
@@ -1,5 +1,5 @@
#define COMMUNICATION_COOLDOWN 600
#define COMMUNICATION_COOLDOWN_AI 600
#define COMMUNICATION_COOLDOWN 300
#define COMMUNICATION_COOLDOWN_AI 300
SUBSYSTEM_DEF(communications)
name = "Communications"
+1 -1
View File
@@ -1,7 +1,7 @@
SUBSYSTEM_DEF(garbage)
name = "Garbage"
priority = 15
wait = 5
wait = 20
flags_1 = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
+4 -4
View File
@@ -22,7 +22,7 @@ SUBSYSTEM_DEF(persistence)
/datum/controller/subsystem/persistence/proc/LoadSatchels()
secret_satchels = new /savefile("data/npc_saves/SecretSatchels.sav")
satchel_blacklist = typecacheof(list(/obj/item/stack/tile/plasteel, /obj/item/weapon/crowbar))
satchel_blacklist = typecacheof(list(/obj/item/stack/tile/plasteel, /obj/item/crowbar))
secret_satchels[SSmapping.config.map_name] >> old_secret_satchels
var/list/expanded_old_satchels = list()
@@ -38,7 +38,7 @@ SUBSYSTEM_DEF(persistence)
var/list/free_satchels = list()
for(var/turf/T in shuffle(block(locate(TRANSITIONEDGE,TRANSITIONEDGE,ZLEVEL_STATION), locate(world.maxx-TRANSITIONEDGE,world.maxy-TRANSITIONEDGE,ZLEVEL_STATION)))) //Nontrivially expensive but it's roundstart only
if(isfloorturf(T) && !istype(T, /turf/open/floor/plating/))
free_satchels += new /obj/item/weapon/storage/backpack/satchel/flat/secret(T)
free_satchels += new /obj/item/storage/backpack/satchel/flat/secret(T)
if(!isemptylist(free_satchels) && ((free_satchels.len + placed_satchels) >= (50 - expanded_old_satchels.len) * 0.1)) //up to six tiles, more than enough to kill anything that moves
break
@@ -59,7 +59,7 @@ SUBSYSTEM_DEF(persistence)
if(!path)
return 0
var/obj/item/weapon/storage/backpack/satchel/flat/F = new()
var/obj/item/storage/backpack/satchel/flat/F = new()
F.x = text2num(chosen_satchel[1])
F.y = text2num(chosen_satchel[2])
F.z = ZLEVEL_STATION
@@ -157,7 +157,7 @@ SUBSYSTEM_DEF(persistence)
/datum/controller/subsystem/persistence/proc/CollectSecretSatchels()
for(var/A in new_secret_satchels)
var/obj/item/weapon/storage/backpack/satchel/flat/F = A
var/obj/item/storage/backpack/satchel/flat/F = A
if(QDELETED(F) || F.z != ZLEVEL_STATION || F.invisibility != INVISIBILITY_MAXIMUM)
continue
var/list/savable_obj = list()
+7 -7
View File
@@ -234,8 +234,8 @@
UpdateButtonIcon()
/datum/action/item_action/toggle_unfriendly_fire/UpdateButtonIcon(status_only = FALSE)
if(istype(target, /obj/item/weapon/hierophant_club))
var/obj/item/weapon/hierophant_club/H = target
if(istype(target, /obj/item/hierophant_club))
var/obj/item/hierophant_club/H = target
if(H.friendly_fire_check)
button_icon_state = "vortex_ff_off"
name = "Toggle Friendly Fire \[OFF\]"
@@ -264,8 +264,8 @@
button_icon_state = "vortex_recall"
/datum/action/item_action/vortex_recall/IsAvailable()
if(istype(target, /obj/item/weapon/hierophant_club))
var/obj/item/weapon/hierophant_club/H = target
if(istype(target, /obj/item/hierophant_club))
var/obj/item/hierophant_club/H = target
if(H.teleporting)
return 0
return ..()
@@ -351,7 +351,7 @@
name = "Toggle Jetpack Stabilization"
/datum/action/item_action/jetpack_stabilization/IsAvailable()
var/obj/item/weapon/tank/jetpack/J = target
var/obj/item/tank/jetpack/J = target
if(!istype(J) || !J.on)
return 0
return ..()
@@ -431,7 +431,7 @@
name = "Create Throwing Stars (1E)"
desc = "Creates some throwing stars"
button_icon_state = "throwingstar"
icon_icon = 'icons/obj/weapons.dmi'
icon_icon = 'icons/obj/items_and_weapons.dmi'
/datum/action/item_action/ninjanet
name = "Energy Net (20E)"
@@ -443,7 +443,7 @@
name = "Recall Energy Katana (Variable Cost)"
desc = "Teleports the Energy Katana linked to this suit to its wearer, cost based on distance."
button_icon_state = "energy_katana"
icon_icon = 'icons/obj/weapons.dmi'
icon_icon = 'icons/obj/items_and_weapons.dmi'
/datum/action/item_action/ninja_stealth
name = "Toggle Stealth"
+3 -3
View File
@@ -320,11 +320,11 @@
//Spawn and equip documents
var/mob/living/carbon/human/mob = owner.current
var/obj/item/weapon/folder/syndicate/folder
var/obj/item/folder/syndicate/folder
if(owner == SSticker.mode.exchange_red)
folder = new/obj/item/weapon/folder/syndicate/red(mob.loc)
folder = new/obj/item/folder/syndicate/red(mob.loc)
else
folder = new/obj/item/weapon/folder/syndicate/blue(mob.loc)
folder = new/obj/item/folder/syndicate/blue(mob.loc)
var/list/slots = list (
"backpack" = slot_in_backpack,
+4 -4
View File
@@ -188,7 +188,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
if(form == BLOOD_LIZARD && SOULVALUE < BLOOD_THRESHOLD)
regress_humanoid()
if(SOULVALUE < 0)
remove_spells()
give_appropriate_spells()
to_chat(owner.current, "<span class='warning'>As punishment for your failures, all of your powers except contract creation have been revoked.")
/datum/antagonist/devil/proc/regress_humanoid()
@@ -408,7 +408,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
reviveNumber += LOSS_PER_DEATH
update_hud()
if(body)
body.revive(1,0)
body.revive(TRUE, TRUE) //Adminrevive also recovers organs, preventing someone from resurrecting without a heart.
if(istype(body.loc, /obj/effect/dummy/slaughter/))
body.forceMove(get_turf(body))//Fixes dying while jaunted leaving you permajaunted.
if(istype(body, /mob/living/carbon/true_devil))
@@ -437,8 +437,8 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
var/mob/living/carbon/human/H = owner.current
H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/black(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_hands)
H.equip_to_slot_or_del(new /obj/item/weapon/pen(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), slot_hands)
H.equip_to_slot_or_del(new /obj/item/pen(H), slot_l_store)
if(SOULVALUE >= BLOOD_THRESHOLD)
H.set_species(/datum/species/lizard, 1)
H.underwear = "Nude"
+5 -5
View File
@@ -29,7 +29,7 @@
qdel(H.gloves)
var/obj/item/clothing/suit/space/space_ninja/theSuit = new(H)
var/obj/item/weapon/dash/energy_katana/EK = new(H)
var/obj/item/dash/energy_katana/EK = new(H)
theSuit.energyKatana = EK
H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_ears)
@@ -42,12 +42,12 @@
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(H), slot_glasses)
H.equip_to_slot_or_del(EK, slot_belt)
H.equip_to_slot_or_del(new /obj/item/device/flashlight(H), slot_r_store)
H.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen(H), slot_s_store)
H.equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack/carbondioxide(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/tank/internals/emergency_oxygen(H), slot_s_store)
H.equip_to_slot_or_del(new /obj/item/tank/jetpack/carbondioxide(H), slot_back)
theSuit.randomize_param()
var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(H)
var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H)
E.implant(H)
return 1
+26 -17
View File
@@ -27,17 +27,21 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo
### Vars
1. `/datum/var/list/datum_components` (private)
* Lazy list of all components a datum has (TODO: Make this a typecache with longer paths overwriting shorter ones maybe? It'd be weird)
* Lazy associated list of type -> component/list of components.
1. `/datum/component/var/enabled` (protected, boolean)
* If the component is enabled. If not, it will not react to signals
* TRUE by default
* `TRUE` by default
1. `/datum/component/var/dupe_mode` (protected, enum)
* How multiple components of the exact same type are handled when added to the datum.
* How duplicate component types are handled when added to the datum.
* `COMPONENT_DUPE_HIGHLANDER` (default): Old component will be deleted, new component will first have `/datum/component/proc/InheritComponent(datum/component/old, FALSE)` on it
* `COMPONENT_DUPE_ALLOWED`: The components will be treated as seperate, `GetComponent()` will return the first added
* `COMPONENT_DUPE_ALLOWED`: The components will be treated as separate, `GetComponent()` will return the first added
* `COMPONENT_DUPE_UNIQUE`: New component will be deleted, old component will first have `/datum/component/proc/InheritComponent(datum/component/new, TRUE)` on it
1. `/datum/component/var/dupe_type` (protected, type)
* Definition of a duplicate component type
* `null` means exact match on `type`
* Any other type means that and all subtypes
1. `/datum/component/var/list/signal_procs` (private)
* Associated lazy list of signals -> callbacks that will be run when the parent datum recieves that signal
* Associated lazy list of signals -> `/datum/callback`s that will be run when the parent datum recieves that signal
1. `/datum/component/var/datum/parent` (protected, read-only)
* The datum this component belongs to
@@ -52,10 +56,12 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo
1. `GET_COMPONENT(varname, component_type)` OR `GET_COMPONENT_FROM(varname, component_type, src)`
* Shorthand for `var/component_type/varname = src.GetComponent(component_type)`
1. `/datum/proc/AddComponent(component_type(type), ...) -> datum/component` (public, final)
* Creates an instance of `component_type` in the datum and passes `...` to it's `New()` call
* Creates an instance of `component_type` in the datum and passes `...` to its `Initialize()` call
* Sends the `COMSIG_COMPONENT_ADDED` signal to the datum
* All components a datum owns are deleted with the datum
* Returns the component that was created. Or the old component in a dupe situation where `COMPONENT_DUPE_UNIQUE` was set
1. `/datum/proc/LoadComponent(component_type(type), ...) -> datum/component` (public, final)
* Equivalent to calling `GetComponent(component_type)` where, if the result would be `null`, returns `AddComponent(component_type, ...)` instead
1. `/datum/proc/ComponentActivated(datum/component/C)` (abstract)
* Called on a component's `parent` after a signal recieved causes it to activate. `src` is the parameter
* Will only be called if a component's callback returns `TRUE`
@@ -66,16 +72,24 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo
1. `/datum/proc/SendSignal(signal, ...)` (public, final)
* Call to send a signal to the components of the target datum
* Extra arguments are to be specified in the signal definition
1. `/datum/component/New(datum/parent, ...)` (protected, virtual)
* Forwarded the arguments from `AddComponent()`
1. `/datum/component/Destroy()` (virtual)
1. `/datum/component/New(datum/parent, ...)` (private, final)
* Runs internal setup for the component
* Extra arguments are passed to `Initialize()`
1. `/datum/component/Initialize(...)` (abstract, no-sleep)
* Called by `New()` with the same argments excluding `parent`
* Component does not exist in `parent`'s `datum_components` list yet, although `parent` is set and may be used
* Signals will not be recieved while this function is running
* Component may be deleted after this function completes without being attached
1. `/datum/component/Destroy()` (virtual, no-sleep)
* Sends the `COMSIG_COMPONENT_REMOVING` signal to the parent datum if the `parent` isn't being qdeleted
* Properly removes the component from `parent` and cleans up references
1. `/datum/component/proc/InheritComponent(datum/component/C, i_am_original(boolean))` (abstract)
1. `/datum/component/proc/InheritComponent(datum/component/C, i_am_original(boolean))` (abstract, no-sleep)
* Called on a component when a component of the same type was added to the same parent
* See `/datum/component/var/dupe_mode`
* `C`'s type will always be the same of the called component
1. `/datum/component/proc/OnTransfer(datum/new_parent)` (abstract)
1. `/datum/component/proc/AfterComponentActivated()` (abstract)
* Called on a component that was activated after it's `parent`'s `ComponentActivated()` is called
1. `/datum/component/proc/OnTransfer(datum/new_parent)` (abstract, no-sleep)
* Called before the new `parent` is assigned in `TakeComponent()`, after the remove signal, before the added signal
* Allows the component to react to ownership transfers
1. `/datum/component/proc/_RemoveNoSignal()` (private, final)
@@ -91,9 +105,4 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo
* Called when a component recieves any signal and is enabled
* Default implementation looks if the signal is registered and runs the appropriate proc
### See signals and their arguments in __DEFINES\components.dm
## Examples
Material Containers: #29268 (Too many GetComponent calls, but not bad)
Slips: #00000 (PR DIS)
Powercells: (TODO)
### See/Define signals and their arguments in __DEFINES\components.dm
+10 -9
View File
@@ -19,15 +19,16 @@
old = P.GetExactComponent(type)
else
old = P.GetComponent(dt)
switch(dm)
if(COMPONENT_DUPE_UNIQUE)
old.InheritComponent(src, TRUE)
parent = null //prevent COMPONENT_REMOVING signal
qdel(src)
return
if(COMPONENT_DUPE_HIGHLANDER)
InheritComponent(old, FALSE)
qdel(old)
if(old)
switch(dm)
if(COMPONENT_DUPE_UNIQUE)
old.InheritComponent(src, TRUE)
parent = null //prevent COMPONENT_REMOVING signal
qdel(src)
return
if(COMPONENT_DUPE_HIGHLANDER)
InheritComponent(old, FALSE)
qdel(old)
//let the others know
P.SendSignal(COMSIG_COMPONENT_ADDED, src)
+21
View File
@@ -0,0 +1,21 @@
/datum/component/slippery
var/intensity
var/lube_flags
var/mob/slip_victim
/datum/component/slippery/Initialize(_intensity, _lube_flags = NONE)
intensity = max(_intensity, 0)
lube_flags = _lube_flags
if(ismovableatom(parent))
RegisterSignal(COMSIG_MOVABLE_CROSSED, .proc/Slip)
else
RegisterSignal(COMSIG_ATOM_ENTERED, .proc/Slip)
/datum/component/slippery/proc/Slip(atom/movable/AM)
var/mob/victim = AM
if(istype(victim) && !victim.is_flying() && victim.slip(intensity, parent, lube_flags))
slip_victim = victim
return TRUE
/datum/component/slippery/AfterComponentActivated()
slip_victim = null
+2 -2
View File
@@ -210,8 +210,8 @@
if(!C)
C = H.client
var/image = get_id_photo(H, C)
var/obj/item/weapon/photo/photo_front = new()
var/obj/item/weapon/photo/photo_side = new()
var/obj/item/photo/photo_front = new()
var/obj/item/photo/photo_side = new()
photo_front.photocreate(null, icon(image, dir = SOUTH))
photo_side.photocreate(null, icon(image, dir = WEST))
+11 -5
View File
@@ -22,10 +22,16 @@
continue
qdel(timer)
var/list/dc = datum_components
for(var/I in dc)
var/datum/component/C = I
C._RemoveNoSignal()
qdel(C)
if(dc)
var/all_components = dc[/datum/component]
if(islist(all_components))
for(var/I in all_components)
var/datum/component/C = I
C._RemoveNoSignal()
qdel(C)
else
var/datum/component/C = all_components
C._RemoveNoSignal()
qdel(C)
dc.Cut()
return QDEL_HINT_QUEUE
return QDEL_HINT_QUEUE
+1 -1
View File
@@ -92,7 +92,7 @@
switch(target_zone)
if(1)
if(isobj(H.head) && !istype(H.head, /obj/item/weapon/paper))
if(isobj(H.head) && !istype(H.head, /obj/item/paper))
Cl = H.head
passed = prob((Cl.permeability_coefficient*100) - 1)
if(passed && isobj(H.wear_mask))
+1 -1
View File
@@ -78,7 +78,7 @@ STI KALY - blind
else
var/mob/living/carbon/H = affected_mob
if(prob(chance))
var/obj/item/weapon/staff/S = new(H)
var/obj/item/staff/S = new(H)
if(!H.put_in_hands(S))
qdel(S)
+1 -1
View File
@@ -38,7 +38,7 @@
msg = replace_pronoun(user, msg)
var/mob/living/L = user
for(var/obj/item/weapon/implant/I in L.implants)
for(var/obj/item/implant/I in L.implants)
I.trigger(key, L)
if(!msg)
+2 -2
View File
@@ -149,10 +149,10 @@
/datum/teleport/instant/science/setPrecision(aprecision)
..()
if(istype(teleatom, /obj/item/weapon/storage/backpack/holding))
if(istype(teleatom, /obj/item/storage/backpack/holding))
precision = rand(1,100)
var/list/bagholding = teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)
var/list/bagholding = teleatom.search_contents_for(/obj/item/storage/backpack/holding)
if(bagholding.len)
precision = max(rand(1,100)*bagholding.len,100)
if(isliving(teleatom))
+8 -6
View File
@@ -27,7 +27,7 @@
var/config_max_users = 0
var/config_min_users = 0
var/voteweight = 1
var/allow_custom_shuttles = "yes"
/datum/map_config/New(filename = "data/next_map.json", default_to_box, delete_after)
if(default_to_box)
return
@@ -44,12 +44,12 @@
if(!json)
log_world("Could not open map_config: [filename]")
return
json = file2text(json)
if(!json)
log_world("map_config is not text: [filename]")
return
json = json_decode(json)
if(!json)
log_world("map_config is not json: [filename]")
@@ -58,7 +58,7 @@
if(!ValidateJSON(json))
log_world("map_config failed to validate for above reason: [filename]")
return
config_filename = filename
map_name = json["map_name"]
@@ -66,6 +66,7 @@
map_file = json["map_file"]
minetype = json["minetype"]
allow_custom_shuttles = json["allow_custom_shuttles"]
var/list/jtcl = json["transition_config"]
@@ -74,7 +75,7 @@
for(var/I in jtcl)
transition_config[TransitionStringToEnum(I)] = TransitionStringToEnum(jtcl[I])
defaulted = FALSE
#define CHECK_EXISTS(X) if(!istext(json[X])) { log_world(X + "missing from json!"); return; }
@@ -84,6 +85,7 @@
CHECK_EXISTS("map_file")
CHECK_EXISTS("minetype")
CHECK_EXISTS("transition_config")
CHECK_EXISTS("allow_custom_shuttles")
var/path = GetFullMapPath(json["map_path"], json["map_file"])
if(!fexists(path))
@@ -92,7 +94,7 @@
if(json["transition_config"] != "default")
if(!islist(json["transition_config"]))
log_world("transition_config is not a list!")
log_world("transition_config is not a list!")
return
var/list/jtcl = json["transition_config"]
+2 -2
View File
@@ -181,13 +181,13 @@
to_chat(usr, "<b><i>In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to block and sometimes even counter attacks done to you.</i></b>")
/obj/item/weapon/cqc_manual
/obj/item/cqc_manual
name = "old manual"
desc = "A small, black manual. There are drawn instructions of tactical hand-to-hand combat."
icon = 'icons/obj/library.dmi'
icon_state ="cqcmanual"
/obj/item/weapon/cqc_manual/attack_self(mob/living/carbon/human/user)
/obj/item/cqc_manual/attack_self(mob/living/carbon/human/user)
if(!istype(user) || !user)
return
to_chat(user, "<span class='boldannounce'>You remember the basics of CQC.</span>")
+2 -2
View File
@@ -93,14 +93,14 @@
to_chat(usr, "<span class='notice'>Throwback</span>: Disarm Harm Disarm. Throws the target and an item at them.")
to_chat(usr, "<span class='notice'>The Plasma Fist</span>: Harm Disarm Disarm Disarm Harm. Knocks the brain out of the opponent and gibs their body.")
/obj/item/weapon/plasma_fist_scroll
/obj/item/plasma_fist_scroll
name = "frayed scroll"
desc = "An aged and frayed scrap of paper written in shifting runes. There are hand-drawn illustrations of pugilism."
icon = 'icons/obj/wizard.dmi'
icon_state ="scroll2"
var/used = 0
/obj/item/weapon/plasma_fist_scroll/attack_self(mob/user)
/obj/item/plasma_fist_scroll/attack_self(mob/user)
if(!ishuman(user))
return
if(!used)
+7 -7
View File
@@ -154,13 +154,13 @@
to_chat(usr, "<span class='notice'>Head Kick</span>: Disarm Harm Harm. Decent damage, forces opponent to drop item in hand.")
to_chat(usr, "<span class='notice'>Elbow Drop</span>: Harm Disarm Harm Disarm Harm. Opponent must be on the ground. Deals huge damage, instantly kills anyone in critical condition.")
/obj/item/weapon/sleeping_carp_scroll
/obj/item/sleeping_carp_scroll
name = "mysterious scroll"
desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art."
icon = 'icons/obj/wizard.dmi'
icon_state = "scroll2"
/obj/item/weapon/sleeping_carp_scroll/attack_self(mob/living/carbon/human/user)
/obj/item/sleeping_carp_scroll/attack_self(mob/living/carbon/human/user)
if(!istype(user) || !user)
return
var/message = "<span class='sciradio'>You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \
@@ -173,7 +173,7 @@
new /obj/effect/decal/cleanable/ash(get_turf(src))
qdel(src)
/obj/item/weapon/twohanded/bostaff
/obj/item/twohanded/bostaff
name = "bo staff"
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate."
force = 10
@@ -184,17 +184,17 @@
throwforce = 20
throw_speed = 2
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
icon = 'icons/obj/weapons.dmi'
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "bostaff0"
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
block_chance = 50
/obj/item/weapon/twohanded/bostaff/update_icon()
/obj/item/twohanded/bostaff/update_icon()
icon_state = "bostaff[wielded]"
return
/obj/item/weapon/twohanded/bostaff/attack(mob/target, mob/living/user)
/obj/item/twohanded/bostaff/attack(mob/target, mob/living/user)
add_fingerprint(user)
if((CLUMSY in user.disabilities) && prob(50))
to_chat(user, "<span class ='warning'>You club yourself over the head with [src].</span>")
@@ -243,7 +243,7 @@
else
return ..()
/obj/item/weapon/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
/obj/item/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(wielded)
return ..()
return 0
+3 -3
View File
@@ -438,11 +438,11 @@
add_logs(A, D, "cinched")
return 1
/obj/item/weapon/storage/belt/champion/wrestling
/obj/item/storage/belt/champion/wrestling
name = "Wrestling Belt"
var/datum/martial_art/wrestling/style = new
/obj/item/weapon/storage/belt/champion/wrestling/equipped(mob/user, slot)
/obj/item/storage/belt/champion/wrestling/equipped(mob/user, slot)
if(!ishuman(user))
return
if(slot == slot_belt)
@@ -450,7 +450,7 @@
style.teach(H,1)
return
/obj/item/weapon/storage/belt/champion/wrestling/dropped(mob/user)
/obj/item/storage/belt/champion/wrestling/dropped(mob/user)
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
+7 -7
View File
@@ -223,7 +223,7 @@
name = "Metal"
id = MAT_METAL
sheet_type = /obj/item/stack/sheet/metal
coin_type = /obj/item/weapon/coin/iron
coin_type = /obj/item/coin/iron
/datum/material/glass
name = "Glass"
@@ -234,31 +234,31 @@
name = "Silver"
id = MAT_SILVER
sheet_type = /obj/item/stack/sheet/mineral/silver
coin_type = /obj/item/weapon/coin/silver
coin_type = /obj/item/coin/silver
/datum/material/gold
name = "Gold"
id = MAT_GOLD
sheet_type = /obj/item/stack/sheet/mineral/gold
coin_type = /obj/item/weapon/coin/gold
coin_type = /obj/item/coin/gold
/datum/material/diamond
name = "Diamond"
id = MAT_DIAMOND
sheet_type = /obj/item/stack/sheet/mineral/diamond
coin_type = /obj/item/weapon/coin/diamond
coin_type = /obj/item/coin/diamond
/datum/material/uranium
name = "Uranium"
id = MAT_URANIUM
sheet_type = /obj/item/stack/sheet/mineral/uranium
coin_type = /obj/item/weapon/coin/uranium
coin_type = /obj/item/coin/uranium
/datum/material/plasma
name = "Solid Plasma"
id = MAT_PLASMA
sheet_type = /obj/item/stack/sheet/mineral/plasma
coin_type = /obj/item/weapon/coin/plasma
coin_type = /obj/item/coin/plasma
/datum/material/bluespace
name = "Bluespace Mesh"
@@ -269,7 +269,7 @@
name = "Bananium"
id = MAT_BANANIUM
sheet_type = /obj/item/stack/sheet/mineral/bananium
coin_type = /obj/item/weapon/coin/clown
coin_type = /obj/item/coin/clown
/datum/material/titanium
name = "Titanium"
+2 -2
View File
@@ -271,7 +271,7 @@
var/list/all_contents = traitor_mob.GetAllContents()
var/obj/item/device/pda/PDA = locate() in all_contents
var/obj/item/device/radio/R = locate() in all_contents
var/obj/item/weapon/pen/P = locate() in all_contents //including your PDA-pen!
var/obj/item/pen/P = locate() in all_contents //including your PDA-pen!
var/obj/item/uplink_loc
@@ -1038,7 +1038,7 @@
if("takeequip")
var/list/L = current.get_contents()
for(var/obj/item/weapon/pen/gang/pen in L)
for(var/obj/item/pen/gang/pen in L)
qdel(pen)
for(var/obj/item/device/gangtool/gangtool in L)
qdel(gangtool)
+1 -1
View File
@@ -101,7 +101,7 @@
H.update_action_buttons_icon()
if(implants)
for(var/implant_type in implants)
var/obj/item/weapon/implant/I = new implant_type(H)
var/obj/item/implant/I = new implant_type(H)
I.implant(H, null, silent=TRUE)
H.update_body()
+2 -2
View File
@@ -35,8 +35,8 @@
/datum/recipe
var/list/reagents_list // example: = list("berryjuice" = 5) // do not list same reagent twice
var/list/items // example: =list(/obj/item/weapon/crowbar, /obj/item/weapon/welder) // place /foo/bar before /foo
var/result //example: = /obj/item/weapon/reagent_containers/food/snacks/donut
var/list/items // example: =list(/obj/item/crowbar, /obj/item/welder) // place /foo/bar before /foo
var/result //example: = /obj/item/reagent_containers/food/snacks/donut
var/time = 100 // 1/10 part of second
+2 -2
View File
@@ -255,7 +255,7 @@
///////////////BOATS////////////
/datum/riding/boat
keytype = /obj/item/weapon/oar
keytype = /obj/item/oar
/datum/riding/boat/handle_ride(mob/user, direction)
var/turf/next = get_step(ridden, direction)
@@ -416,7 +416,7 @@
/obj/item/riding_offhand
name = "offhand"
icon = 'icons/obj/weapons.dmi'
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "offhand"
w_class = WEIGHT_CLASS_HUGE
flags_1 = ABSTRACT_1 | DROPDEL_1 | NOBLUDGEON_1
+1 -1
View File
@@ -1,6 +1,6 @@
diff a/code/datums/riding.dm b/code/datums/riding.dm (rejected hunks)
@@ -419,7 +419,7 @@
icon = 'icons/obj/items_and_weapons.dmi'
icon = 'icons/obj/items_and_weapons.dmi.dmi'
icon_state = "offhand"
w_class = WEIGHT_CLASS_HUGE
- flags = ABSTRACT | DROPDEL | NOBLUDGEON
+1 -1
View File
@@ -192,7 +192,7 @@
/datum/status_effect/his_grace/tick()
bloodlust = 0
var/graces = 0
for(var/obj/item/weapon/his_grace/HG in owner.held_items)
for(var/obj/item/his_grace/HG in owner.held_items)
if(HG.bloodthirst > bloodlust)
bloodlust = HG.bloodthirst
if(HG.awakened)
+17 -3
View File
@@ -85,7 +85,7 @@
alerttooltipstyle = "hisgrace"
/datum/status_effect/his_wrath/tick()
for(var/obj/item/weapon/his_grace/HG in owner.held_items)
for(var/obj/item/his_grace/HG in owner.held_items)
qdel(src)
return
owner.adjustBruteLoss(0.1)
@@ -139,6 +139,20 @@
if(owner.m_intent == MOVE_INTENT_WALK)
owner.toggle_move_intent()
/datum/status_effect/geis_tracker
id = "geis_tracker"
duration = -1
alert_type = null
var/obj/structure/destructible/clockwork/geis_binding/binding
/datum/status_effect/geis_tracker/on_creation(mob/living/new_owner, obj/structure/destructible/clockwork/geis_binding/new_binding)
. = ..()
if(.)
binding = new_binding
/datum/status_effect/geis_tracker/tick()
if(QDELETED(binding))
qdel(src)
/datum/status_effect/maniamotor
id = "maniamotor"
@@ -243,9 +257,9 @@
status_type = STATUS_EFFECT_REPLACE
alert_type = null
var/mutable_appearance/marked_underlay
var/obj/item/weapon/twohanded/required/kinetic_crusher/hammer_synced
var/obj/item/twohanded/required/kinetic_crusher/hammer_synced
/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, obj/item/weapon/twohanded/required/kinetic_crusher/new_hammer_synced)
/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, obj/item/twohanded/required/kinetic_crusher/new_hammer_synced)
. = ..()
if(.)
hammer_synced = new_hammer_synced
+5 -5
View File
@@ -13,16 +13,16 @@
/datum/wires/explosive/c4
holder_type = /obj/item/weapon/grenade/plastic/c4
holder_type = /obj/item/grenade/plastic/c4
randomize = TRUE //Same behaviour since no wire actually disarms it
/datum/wires/explosive/c4/interactable(mob/user)
var/obj/item/weapon/grenade/plastic/c4/P = holder
var/obj/item/grenade/plastic/c4/P = holder
if(P.open_panel)
return TRUE
/datum/wires/explosive/c4/explode()
var/obj/item/weapon/grenade/plastic/c4/P = holder
var/obj/item/grenade/plastic/c4/P = holder
P.explode()
@@ -73,8 +73,8 @@
/datum/wires/explosive/gibtonite
holder_type = /obj/item/weapon/twohanded/required/gibtonite
holder_type = /obj/item/twohanded/required/gibtonite
/datum/wires/explosive/gibtonite/explode()
var/obj/item/weapon/twohanded/required/gibtonite/P = holder
var/obj/item/twohanded/required/gibtonite/P = holder
P.GibtoniteReaction(null, 2)
+2 -2
View File
@@ -3,7 +3,7 @@
/proc/is_wire_tool(obj/item/I)
if(istype(I, /obj/item/device/multitool))
return TRUE
if(istype(I, /obj/item/weapon/wirecutters))
if(istype(I, /obj/item/wirecutters))
return TRUE
if(istype(I, /obj/item/device/assembly))
var/obj/item/device/assembly/A = I
@@ -227,7 +227,7 @@
var/obj/item/I = L.get_active_held_item()
switch(action)
if("cut")
if(istype(I, /obj/item/weapon/wirecutters) || IsAdminGhost(usr))
if(istype(I, /obj/item/wirecutters) || IsAdminGhost(usr))
playsound(holder, I.usesound, 20, 1)
cut_color(target_wire)
. = TRUE
+47 -23
View File
@@ -264,21 +264,44 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Central Asteroid Maintenance"
icon_state = "maintcentral"
/area/maintenance/asteroid/disposal/east
name = "Eastern External Waste Belt"
/area/maintenance/asteroid/disposal
icon_state = "disposal"
/area/maintenance/asteroid/disposal/north
name = "Northern External Waste Belt"
icon_state = "disposal"
name = "Northern Disposal"
/area/maintenance/asteroid/disposal/southeast
name = "South-Eastern Disposal"
icon_state = "disposal"
/area/maintenance/asteroid/disposal/north/east
name = "North-Eastern Disposal"
/area/maintenance/asteroid/disposal/southwest
/area/maintenance/asteroid/disposal/north/west
name = "North-Western Disposal"
/area/maintenance/asteroid/disposal/east
name = "Eastern Disposal"
/area/maintenance/asteroid/disposal/west
name = "Western Disposal"
/area/maintenance/asteroid/disposal/west/secondary
name = "Secondary Western Disposal"
/area/maintenance/asteroid/disposal/south
name = "Southern Disposal"
/area/maintenance/asteroid/disposal/south/west
name = "South-Western Disposal"
icon_state = "disposal"
/area/maintenance/asteroid/disposal/external/east
name = "Eastern External Waste Belt"
/area/maintenance/asteroid/disposal/external/north
name = "Northern External Waste Belt"
/area/maintenance/asteroid/disposal/external/southeast
name = "South-Eastern External Waste Belt"
/area/maintenance/asteroid/disposal/external/southwest
name = "South-Western External Waste Belt"
/area/maintenance/asteroid/fore/cargo_west
name = "Fore Asteroid Maintenance"
@@ -531,15 +554,19 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/crew_quarters/toilet/locker
name = "Locker Toilets"
icon_state = "toilet"
/area/crew_quarters/toilet/fitness
name = "Fitness Toilets"
icon_state = "toilet"
/area/crew_quarters/toilet/female
name = "Female Toilets"
icon_state = "toilet"
/area/crew_quarters/toilet/male
name = "Male Toilets"
icon_state = "toilet"
/area/crew_quarters/toilet/restrooms
name = "Restrooms"
icon_state = "toilet"
@@ -817,13 +844,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Starboard Bow Auxiliary Solar Maintenance"
icon_state = "SolarcontrolA"
/area/assembly/assembly_line //Derelict Assembly Line
name = "Assembly Line"
icon_state = "ass_line"
power_equip = FALSE
power_light = FALSE
power_environ = FALSE
//Teleporter
/area/teleporter
@@ -1007,10 +1027,15 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Firing Range"
icon_state = "firingrange"
/area/security/transfer
name = "Transfer Centre"
/area/security/execution
icon_state = "execution_room"
/area/security/execution/transfer
name = "Transfer Centre"
/area/security/execution/education
name = "Prisoner Education Chamber"
/area/security/nuke_storage
name = "Vault"
icon_state = "nuke_storage"
@@ -1463,7 +1488,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
//SPACE STATION 13
GLOBAL_LIST_INIT(the_station_areas, list (
/area/assembly,
/area/bridge,
/area/chapel,
/area/construction,
@@ -1490,4 +1514,4 @@ GLOBAL_LIST_INIT(the_station_areas, list (
/area/ai_monitored/turret_protected/ai_upload, //do not try to simplify to "/area/ai_monitored/turret_protected" --rastaf0
/area/ai_monitored/turret_protected/ai_upload_foyer,
/area/ai_monitored/turret_protected/ai,
))
))
+6
View File
@@ -477,3 +477,9 @@ GLOBAL_LIST_EMPTY(teleportlocs)
valid_territory = FALSE
blob_allowed = FALSE
addSorted()
/area/AllowDrop()
CRASH("Bad op: area/AllowDrop() called")
/area/drop_location()
CRASH("Bad op: area/drop_location() called")
-16
View File
@@ -22,22 +22,6 @@
//Misc
/area/wreck/ai
name = "AI Chamber"
icon_state = "ai"
/area/wreck/main
name = "Wreck"
icon_state = "storage"
/area/wreck/engineering
name = "Power Room"
icon_state = "engine"
/area/wreck/bridge
name = "Bridge"
icon_state = "bridge"
/area/generic
name = "Unknown"
icon_state = "storage"
+19
View File
@@ -0,0 +1,19 @@
//Parent types
/area/ruin
name = "\improper Unexplored Location"
icon_state = "away"
has_gravity = TRUE
hidden = TRUE
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
/area/ruin/unpowered
always_unpowered = FALSE
/area/ruin/unpowered/no_grav
has_gravity = FALSE
/area/ruin/powered
requires_power = FALSE
+51
View File
@@ -0,0 +1,51 @@
//Lavaland Ruins
/area/ruin/powered/beach
icon_state = "dk_yellow"
/area/ruin/powered/clownplanet
icon_state = "dk_yellow"
/area/ruin/powered/animal_hospital
icon_state = "dk_yellow"
/area/ruin/powered/snow_biodome
icon_state = "dk_yellow"
/area/ruin/powered/gluttony
icon_state = "dk_yellow"
/area/ruin/powered/golem_ship
name = "Free Golem Ship"
icon_state = "dk_yellow"
/area/ruin/powered/greed
icon_state = "dk_yellow"
/area/ruin/unpowered/hierophant
name = "Hierophant's Arena"
icon_state = "dk_yellow"
/area/ruin/powered/pride
icon_state = "dk_yellow"
/area/ruin/powered/seedvault
icon_state = "dk_yellow"
/area/ruin/powered/syndicate_lava_base
name = "Secret Base"
icon_state = "dk_yellow"
//Xeno Nest
/area/ruin/unpowered/xenonest
name = "The Hive"
always_unpowered = TRUE
power_environ = FALSE
power_equip = FALSE
power_light = FALSE
poweralm = FALSE
//ash walker nest
/area/ruin/unpowered/ash_walkers
icon_state = "red"
+429
View File
@@ -0,0 +1,429 @@
//Space Ruin Parents
/area/ruin/space
has_gravity = FALSE
blob_allowed = FALSE //Nope, no winning in space as a blob. Gotta eat the station.
/area/ruin/space/has_grav
has_gravity = TRUE
/area/ruin/space/has_grav/powered
requires_power = FALSE
/area/ruin/fakespace
icon_state = "space"
requires_power = TRUE
always_unpowered = TRUE
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
has_gravity = FALSE
power_light = FALSE
power_equip = FALSE
power_environ = FALSE
valid_territory = FALSE
outdoors = TRUE
ambientsounds = list('sound/ambience/ambispace.ogg','sound/ambience/title2.ogg')
blob_allowed = FALSE
/////////////
/area/ruin/space/way_home
name = "\improper Salvation"
icon_state = "away"
always_unpowered = FALSE
// Ruins of "onehalf" ship
/area/ruin/space/has_grav/onehalf/hallway
name = "Hallway"
icon_state = "hallC"
/area/ruin/space/has_grav/onehalf/drone_bay
name = "Mining Drone Bay"
icon_state = "engine"
/area/ruin/space/has_grav/onehalf/dorms_med
name = "Crew Quarters"
icon_state = "Sleep"
/area/ruin/space/has_grav/onehalf/bridge
name = "Bridge"
icon_state = "bridge"
/area/ruin/space/has_grav/powered/dinner_for_two
name = "Dinner for Two"
/area/ruin/space/has_grav/powered/authorship
name = "Authorship"
/area/ruin/space/has_grav/powered/aesthetic
name = "Aesthetic"
ambientsounds = list('sound/ambience/ambivapor1.ogg')
//Ruin of Hotel
/area/ruin/space/has_grav/hotel
name = "Hotel"
/area/ruin/space/has_grav/hotel/guestroom
name = "Hotel Guest Room"
icon_state = "Sleep"
/area/ruin/space/has_grav/hotel/security
name = "Hotel Security Post"
icon_state = "security"
/area/ruin/space/has_grav/hotel/pool
name = "Hotel Pool Room"
icon_state = "fitness"
/area/ruin/space/has_grav/hotel/bar
name = "Hotel Bar"
icon_state = "cafeteria"
/area/ruin/space/has_grav/hotel/power
name = "Hotel Power Room"
icon_state = "engine_smes"
/area/ruin/space/has_grav/hotel/custodial
name = "Hotel Custodial Closet"
icon_state = "janitor"
/area/ruin/space/has_grav/hotel/shuttle
name = "Hotel Shuttle"
icon_state = "shuttle"
requires_power = FALSE
/area/ruin/space/has_grav/hotel/dock
name = "Hotel Shuttle Dock"
icon_state = "start"
/area/ruin/space/has_grav/hotel/workroom
name = "Hotel Staff Room"
icon_state = "crew_quarters"
//Ruin of Derelict Oupost
/area/ruin/space/has_grav/derelictoutpost
name = "Derelict Outpost"
icon_state = "green"
/area/ruin/space/has_grav/derelictoutpost/cargostorage
name = "Derelict Outpost Cargo Storage"
icon_state = "storage"
/area/ruin/space/has_grav/derelictoutpost/cargobay
name = "Derelict Outpost Cargo Bay"
icon_state = "quartstorage"
/area/ruin/space/has_grav/derelictoutpost/powerstorage
name = "Derelict Outpost Power Storage"
icon_state = "engine_smes"
/area/ruin/space/has_grav/derelictoutpost/dockedship
name = "Derelict Outpost Docked Ship"
icon_state = "red"
//Ruin of Space Bar
/area/ruin/space/has_grav/powered/spacebar
name = "Space Bar"
icon_state = "bar"
//Ruin of turretedoutpost
/area/ruin/space/has_grav/turretedoutpost
name = "Turreted Outpost"
icon_state = "red"
//Ruin of old teleporter
/area/ruin/space/oldteleporter
name = "Old teleporter"
icon_state = "teleporter"
//Ruin of mech transport
/area/ruin/space/has_grav/powered/mechtransport
name = "Mech Transport"
icon_state = "green"
//Ruin of gas the lizard
/area/ruin/space/has_grav/gasthelizard
name = "Gas the lizard"
//Ruin of Deep Storage
/area/ruin/space/has_grav/deepstorage
name = "Deep Storage"
icon_state = "storage"
/area/ruin/space/has_grav/deepstorage/airlock
name = "Deep Storage Airlock"
icon_state = "quart"
/area/ruin/space/has_grav/deepstorage/power
name = "Deep Storage Power and Atmospherics Room"
icon_state = "engi_storage"
/area/ruin/space/has_grav/deepstorage/hydroponics
name = "Deep Storage Hydroponics"
icon_state = "garden"
/area/ruin/space/has_grav/deepstorage/armory
name = "Deep Storage Secure Storage"
icon_state = "armory"
/area/ruin/space/has_grav/deepstorage/storage
name = "Deep Storage Storage"
icon_state = "storage_wing"
/area/ruin/space/has_grav/deepstorage/dorm
name = "Deep Storage Dormory"
icon_state = "crew_quarters"
/area/ruin/space/has_grav/deepstorage/kitchen
name = "Deep Storage Kitchen"
icon_state = "kitchen"
/area/ruin/space/has_grav/deepstorage/crusher
name = "Deep Storage Recycler"
icon_state = "storage"
//Ruin of Abandoned Zoo
/area/ruin/space/has_grav/abandonedzoo
name = "Abandoned Zoo"
icon_state = "green"
//Ruin of ancient Space Station
/area/ruin/space/has_grav/ancientstation
name = "Charlie Station Main Corridor"
icon_state = "green"
/area/ruin/space/has_grav/ancientstation/powered
name = "Powered Tile"
icon_state = "teleporter"
requires_power = FALSE
/area/ruin/space/has_grav/ancientstation/space
name = "Exposed To Space"
icon_state = "teleporter"
has_gravity = FALSE
/area/ruin/space/has_grav/ancientstation/atmo
name = "Beta Station Atmospherics"
icon_state = "red"
has_gravity = FALSE
/area/ruin/space/has_grav/ancientstation/betanorth
name = "Beta Station North Corridor"
icon_state = "blue"
/area/ruin/space/has_grav/ancientstation/solar
name = "Station Solar Array"
icon_state = "panelsAP"
/area/ruin/space/has_grav/ancientstation/engi
name = "Charlie Station Engineering"
icon_state = "engine"
/area/ruin/space/has_grav/ancientstation/comm
name = "Charlie Station Command"
icon_state = "captain"
/area/ruin/space/has_grav/ancientstation/hydroponics
name = "Charlie Station Hydroponics"
icon_state = "garden"
/area/ruin/space/has_grav/ancientstation/kitchen
name = "Charlie Station Kitchen"
icon_state = "kitchen"
/area/ruin/space/has_grav/ancientstation/sec
name = "Charlie Station Security"
icon_state = "red"
/area/ruin/space/has_grav/ancientstation/deltacorridor
name = "Delta Station Main Corridor"
icon_state = "green"
/area/ruin/space/has_grav/ancientstation/proto
name = "Delta Station Prototype Lab"
icon_state = "toxlab"
/area/ruin/space/has_grav/ancientstation/rnd
name = "Delta Station Research and Development"
icon_state = "toxlab"
/area/ruin/space/has_grav/ancientstation/hivebot
name = "Hivebot Mothership"
icon_state = "teleporter"
//DERELICT
/area/ruin/space/derelict
name = "Derelict Station"
icon_state = "storage"
/area/ruin/space/derelict/hallway/primary
name = "Derelict Primary Hallway"
icon_state = "hallP"
/area/ruin/space/derelict/hallway/secondary
name = "Derelict Secondary Hallway"
icon_state = "hallS"
/area/ruin/space/derelict/hallway/primary/port
name = "Derelict Port Hallway"
icon_state = "hallFP"
/area/ruin/space/derelict/arrival
name = "Derelict Arrival Centre"
icon_state = "yellow"
/area/ruin/space/derelict/storage/equipment
name = "Derelict Equipment Storage"
/area/ruin/space/derelict/storage/storage_access
name = "Derelict Storage Access"
/area/ruin/space/derelict/storage/engine_storage
name = "Derelict Engine Storage"
icon_state = "green"
/area/ruin/space/derelict/bridge
name = "Derelict Control Room"
icon_state = "bridge"
/area/ruin/space/derelict/secret
name = "Derelict Secret Room"
icon_state = "library"
/area/ruin/space/derelict/bridge/access
name = "Derelict Control Room Access"
icon_state = "auxstorage"
/area/ruin/space/derelict/bridge/ai_upload
name = "Derelict Computer Core"
icon_state = "ai"
/area/ruin/space/derelict/solar_control
name = "Derelict Solar Control"
icon_state = "engine"
/area/ruin/space/derelict/se_solar
name = "South East Solars"
icon_state = "engine"
/area/ruin/space/derelict/crew_quarters
name = "Derelict Crew Quarters"
icon_state = "fitness"
/area/ruin/space/derelict/medical
name = "Derelict Medbay"
icon_state = "medbay"
/area/ruin/space/derelict/medical/morgue
name = "Derelict Morgue"
icon_state = "morgue"
/area/ruin/space/derelict/medical/chapel
name = "Derelict Chapel"
icon_state = "chapel"
/area/ruin/space/derelict/teleporter
name = "Derelict Teleporter"
icon_state = "teleporter"
/area/ruin/space/derelict/eva
name = "Derelict EVA Storage"
icon_state = "eva"
/area/ruin/space/derelict/ship
name = "Abandoned Ship"
icon_state = "yellow"
/area/solar/derelict_starboard
name = "Derelict Starboard Solar Array"
icon_state = "panelsS"
/area/solar/derelict_aft
name = "Derelict Aft Solar Array"
icon_state = "yellow"
/area/ruin/space/derelict/singularity_engine
name = "Derelict Singularity Engine"
icon_state = "engine"
/area/ruin/space/derelict/gravity_generator
name = "Derelict Gravity Generator Room"
icon_state = "red"
/area/ruin/space/derelict/atmospherics
name = "Derelict Atmospherics"
icon_state = "red"
/area/ruin/space/derelict/assembly_line
name = "Assembly Line"
icon_state = "ass_line"
power_equip = FALSE
power_light = FALSE
power_environ = FALSE
//DJSTATION
/area/ruin/space/djstation
name = "Ruskie DJ Station"
icon_state = "DJ"
has_gravity = TRUE
blob_allowed = FALSE //Nope, no winning on the DJ station as a blob. Gotta eat the main station.
/area/ruin/space/djstation/solars
name = "DJ Station Solars"
icon_state = "DJ"
has_gravity = TRUE
//ABANDONED TELEPORTER
/area/ruin/space/abandoned_tele
name = "Abandoned Teleporter"
icon_state = "teleporter"
music = "signal"
ambientsounds = list('sound/ambience/ambimalf.ogg')
//OLD AI SAT
/area/ruin/space/old_ai_sat/ai
name = "AI Chamber"
icon_state = "ai"
ambientsounds = list('sound/ambience/ambimalf.ogg')
/area/ruin/space/old_ai_sat/main
name = "Wreck"
icon_state = "storage"
/area/ruin/space/old_ai_sat/engineering
name = "Power Room"
icon_state = "engine"
/area/ruin/space/old_ai_sat/bridge
name = "Bridge"
icon_state = "bridge"
+19 -7
View File
@@ -9,7 +9,7 @@
var/list/fingerprints
var/list/fingerprintshidden
var/list/blood_DNA
var/container_type = 0
var/container_type = NONE
var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff.
var/datum/reagents/reagents = null
@@ -211,8 +211,8 @@
return TRUE
return container_type & DRAWABLE_1
/atom/proc/allow_drop()
return 1
/atom/proc/AllowDrop()
return FALSE
/atom/proc/CheckExit()
return 1
@@ -479,14 +479,17 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
/atom/proc/ratvar_act()
return
/atom/proc/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd)
/atom/proc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
return FALSE
/atom/proc/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode)
/atom/proc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
return FALSE
/atom/proc/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
return 0
/atom/proc/storage_contents_dump_act(obj/item/storage/src_object, mob/user)
return 0
/atom/proc/get_dumping_location(obj/item/storage/source,mob/user)
return null
//This proc is called on the location of an atom when the atom is Destroy()'d
/atom/proc/handle_atom_del(atom/A)
@@ -610,3 +613,12 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
.["Add reagent"] = "?_src_=vars;addreagent=\ref[src]"
.["Trigger EM pulse"] = "?_src_=vars;emp=\ref[src]"
.["Trigger explosion"] = "?_src_=vars;explode=\ref[src]"
/atom/proc/drop_location()
var/atom/L = loc
if(!L)
return null
return L.AllowDrop() ? L : get_turf(L)
/atom/Entered(atom/movable/AM, atom/oldLoc)
SendSignal(COMSIG_ATOM_ENTERED, AM, oldLoc)
+3 -3
View File
@@ -215,7 +215,7 @@
// This is automatically called when something enters your square
//oldloc = old location on atom, inserted when forceMove is called and ONLY when forceMove is called!
/atom/movable/Crossed(atom/movable/AM, oldloc)
return
SendSignal(COMSIG_MOVABLE_CROSSED, AM)
//This is tg's equivalent to the byond bump, it used to be called bump with a second arg
@@ -577,8 +577,8 @@
if(ismob(loc))
var/mob/M = loc
M.transferItemToLoc(src, targetturf, TRUE) //nodrops disks when?
else if(istype(loc, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = loc
else if(istype(loc, /obj/item/storage))
var/obj/item/storage/S = loc
S.remove_from_storage(src, targetturf)
else
forceMove(targetturf)
+4 -4
View File
@@ -202,18 +202,18 @@
for(var/i in list(IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD))
holder = hud_list[i]
holder.icon_state = null
for(var/obj/item/weapon/implant/I in implants)
if(istype(I, /obj/item/weapon/implant/tracking))
for(var/obj/item/implant/I in implants)
if(istype(I, /obj/item/implant/tracking))
holder = hud_list[IMPTRACK_HUD]
var/icon/IC = icon(icon, icon_state, dir)
holder.pixel_y = IC.Height() - world.icon_size
holder.icon_state = "hud_imp_tracking"
else if(istype(I, /obj/item/weapon/implant/mindshield))
else if(istype(I, /obj/item/implant/mindshield))
holder = hud_list[IMPLOYAL_HUD]
var/icon/IC = icon(icon, icon_state, dir)
holder.pixel_y = IC.Height() - world.icon_size
holder.icon_state = "hud_imp_loyal"
else if(istype(I, /obj/item/weapon/implant/chem))
else if(istype(I, /obj/item/implant/chem))
holder = hud_list[IMPCHEM_HUD]
var/icon/IC = icon(icon, icon_state, dir)
holder.pixel_y = IC.Height() - world.icon_size
+24 -24
View File
@@ -1,25 +1,25 @@
/obj/item/weapon/antag_spawner
/obj/item/antag_spawner
throw_speed = 1
throw_range = 5
w_class = WEIGHT_CLASS_TINY
var/used = 0
/obj/item/weapon/antag_spawner/proc/spawn_antag(client/C, turf/T, type = "")
/obj/item/antag_spawner/proc/spawn_antag(client/C, turf/T, type = "")
return
/obj/item/weapon/antag_spawner/proc/equip_antag(mob/target)
/obj/item/antag_spawner/proc/equip_antag(mob/target)
return
///////////WIZARD
/obj/item/weapon/antag_spawner/contract
/obj/item/antag_spawner/contract
name = "contract"
desc = "A magic contract previously signed by an apprentice. In exchange for instruction in the magical arts, they are bound to answer your call for aid."
icon = 'icons/obj/wizard.dmi'
icon_state ="scroll2"
/obj/item/weapon/antag_spawner/contract/attack_self(mob/user)
/obj/item/antag_spawner/contract/attack_self(mob/user)
user.set_machine(src)
var/dat
if(used)
@@ -41,7 +41,7 @@
onclose(user, "radio")
return
/obj/item/weapon/antag_spawner/contract/Topic(href, href_list)
/obj/item/antag_spawner/contract/Topic(href, href_list)
..()
var/mob/living/carbon/human/H = usr
@@ -69,7 +69,7 @@
else
to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.")
/obj/item/weapon/antag_spawner/contract/spawn_antag(client/C, turf/T, type = "")
/obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, type = "")
new /obj/effect/particle_effect/smoke(T)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M)
@@ -90,7 +90,7 @@
if("healing")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null))
M.put_in_hands_or_del(new /obj/item/weapon/gun/magic/staff/healing(M))
M.put_in_hands_or_del(new /obj/item/gun/magic/staff/healing(M))
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.")
if("robeless")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
@@ -120,26 +120,26 @@
M.age = rand(AGE_MIN, WIZARD_AGE_MIN - 1)
M.dna.update_dna_identity()
/obj/item/weapon/antag_spawner/contract/equip_antag(mob/target)
/obj/item/antag_spawner/contract/equip_antag(mob/target)
target.equip_to_slot_or_del(new /obj/item/device/radio/headset(target), slot_ears)
target.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(target), slot_w_uniform)
target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(target), slot_shoes)
target.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(target), slot_wear_suit)
target.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(target), slot_head)
target.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(target), slot_back)
target.equip_to_slot_or_del(new /obj/item/weapon/storage/box(target), slot_in_backpack)
target.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll/apprentice(target), slot_r_store)
target.equip_to_slot_or_del(new /obj/item/storage/backpack(target), slot_back)
target.equip_to_slot_or_del(new /obj/item/storage/box(target), slot_in_backpack)
target.equip_to_slot_or_del(new /obj/item/teleportation_scroll/apprentice(target), slot_r_store)
///////////BORGS AND OPERATIVES
/obj/item/weapon/antag_spawner/nuke_ops
/obj/item/antag_spawner/nuke_ops
name = "syndicate operative teleporter"
desc = "A single-use teleporter designed to quickly reinforce operatives in the field."
icon = 'icons/obj/device.dmi'
icon_state = "locator"
var/borg_to_spawn
/obj/item/weapon/antag_spawner/nuke_ops/proc/check_usability(mob/user)
/obj/item/antag_spawner/nuke_ops/proc/check_usability(mob/user)
if(used)
to_chat(user, "<span class='warning'>[src] is out of power!</span>")
return FALSE
@@ -152,7 +152,7 @@
return TRUE
/obj/item/weapon/antag_spawner/nuke_ops/attack_self(mob/user)
/obj/item/antag_spawner/nuke_ops/attack_self(mob/user)
if(!(check_usability(user)))
return
@@ -169,7 +169,7 @@
else
to_chat(user, "<span class='warning'>Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.</span>")
/obj/item/weapon/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T)
/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M)
M.key = C.key
@@ -184,21 +184,21 @@
M.name = newname
//////SYNDICATE BORG
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele
/obj/item/antag_spawner/nuke_ops/borg_tele
name = "syndicate cyborg teleporter"
desc = "A single-use teleporter designed to quickly reinforce operatives in the field.."
icon = 'icons/obj/device.dmi'
icon_state = "locator"
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/assault
/obj/item/antag_spawner/nuke_ops/borg_tele/assault
name = "syndicate assault cyborg teleporter"
borg_to_spawn = "Assault"
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/medical
/obj/item/antag_spawner/nuke_ops/borg_tele/medical
name = "syndicate medical teleporter"
borg_to_spawn = "Medical"
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T)
/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T)
var/mob/living/silicon/robot/R
switch(borg_to_spawn)
if("Medical")
@@ -224,7 +224,7 @@
///////////SLAUGHTER DEMON
/obj/item/weapon/antag_spawner/slaughter_demon //Warning edgiest item in the game
/obj/item/antag_spawner/slaughter_demon //Warning edgiest item in the game
name = "vial of blood"
desc = "A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures."
icon = 'icons/obj/wizard.dmi'
@@ -236,7 +236,7 @@
var/mob/living/demon_type = /mob/living/simple_animal/slaughter
/obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user)
/obj/item/antag_spawner/slaughter_demon/attack_self(mob/user)
if(user.z != ZLEVEL_STATION)
to_chat(user, "<span class='notice'>You should probably wait until you reach the station.</span>")
return
@@ -257,7 +257,7 @@
to_chat(user, "<span class='notice'>You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.</span>")
/obj/item/weapon/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, type = "")
/obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, type = "")
var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T)
var/mob/living/simple_animal/slaughter/S = new demon_type(holder)
@@ -284,7 +284,7 @@
to_chat(S, "<B>Objective #[1]</B>: [new_objective.explanation_text]")
to_chat(S, "<B>Objective #[new_objective ? "[2]":"[1]"]</B>: [new_objective2.explanation_text]")
/obj/item/weapon/antag_spawner/slaughter_demon/laughter
/obj/item/antag_spawner/slaughter_demon/laughter
name = "vial of tickles"
desc = "A magically infused bottle of clown love, distilled from countless hugging attacks. Used in funny rituals to attract adorable creatures."
icon = 'icons/obj/wizard.dmi'
+4 -4
View File
@@ -1,12 +1,12 @@
////////////Syndicate Cortical Borer
obj/item/weapon/antag_spawner/syndi_borer
obj/item/antag_spawner/syndi_borer
name = "syndicate brain-slug container"
desc = "Releases a modified cortical borer to assist the user."
icon = 'icons/obj/device.dmi' //Temporary? Doesn't really look like a container for xenofauna... but IDK what else could work.
icon_state = "locator"
var/polling = FALSE
obj/item/weapon/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owner)
obj/item/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owner)
var/mob/living/simple_animal/borer/syndi_borer/B = new /mob/living/simple_animal/borer/syndi_borer(T)
B.key = C.key
@@ -27,7 +27,7 @@ obj/item/weapon/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owne
if(new_objective)
to_chat(B, "<B>Objective #[1]</B>: [new_objective.explanation_text]")
SSticker.mode.update_borer_icons_added(B)
/obj/item/weapon/antag_spawner/syndi_borer/proc/check_usability(mob/user)
/obj/item/antag_spawner/syndi_borer/proc/check_usability(mob/user)
if(used)
to_chat(user, "<span class='warning'>[src] appears to be empty!</span>")
return 0
@@ -36,7 +36,7 @@ obj/item/weapon/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owne
return 0
return 1
/obj/item/weapon/antag_spawner/syndi_borer/attack_self(mob/user)
/obj/item/antag_spawner/syndi_borer/attack_self(mob/user)
if(!(check_usability(user)))
return
polling = TRUE
@@ -137,13 +137,13 @@
chemical_cost = 20
dna_cost = 2
req_human = 1
weapon_type = /obj/item/weapon/melee/arm_blade
weapon_type = /obj/item/melee/arm_blade
weapon_name_simple = "blade"
/obj/item/weapon/melee/arm_blade
/obj/item/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 = 'icons/obj/items_and_weapons.dmi'
icon_state = "arm_blade"
item_state = "arm_blade"
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
@@ -159,14 +159,14 @@
sharpness = IS_SHARP
var/can_drop = FALSE
/obj/item/weapon/melee/arm_blade/Initialize(mapload,silent,synthetic)
/obj/item/melee/arm_blade/Initialize(mapload,silent,synthetic)
. = ..()
if(ismob(loc) && !silent)
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='italics'>You hear organic matter ripping and tearing!</span>")
if(synthetic)
can_drop = TRUE
/obj/item/weapon/melee/arm_blade/afterattack(atom/target, mob/user, proximity)
/obj/item/melee/arm_blade/afterattack(atom/target, mob/user, proximity)
if(!proximity)
return
if(istype(target, /obj/structure/table))
@@ -197,10 +197,10 @@
"<span class='italics'>You hear a metal screeching sound.</span>")
A.open(2)
/obj/item/weapon/melee/arm_blade/dropped(mob/user)
/obj/item/melee/arm_blade/dropped(mob/user)
..()
if(can_drop)
new /obj/item/weapon/melee/synthetic_arm_blade(get_turf(user))
new /obj/item/melee/synthetic_arm_blade(get_turf(user))
/***************************************\
|***********COMBAT TENTACLES*************|
@@ -215,14 +215,14 @@
chemical_cost = 10
dna_cost = 2
req_human = 1
weapon_type = /obj/item/weapon/gun/magic/tentacle
weapon_type = /obj/item/gun/magic/tentacle
weapon_name_simple = "tentacle"
silent = TRUE
/obj/item/weapon/gun/magic/tentacle
/obj/item/gun/magic/tentacle
name = "tentacle"
desc = "A fleshy tentacle that can stretch out and grab things or people."
icon = 'icons/obj/weapons.dmi'
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "tentacle"
item_state = "tentacle"
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
@@ -237,7 +237,7 @@
throw_range = 0
throw_speed = 0
/obj/item/weapon/gun/magic/tentacle/Initialize(mapload, silent)
/obj/item/gun/magic/tentacle/Initialize(mapload, silent)
. = ..()
if(ismob(loc))
if(!silent)
@@ -246,10 +246,10 @@
to_chat(loc, "<span class='notice'>You prepare to extend a tentacle.</span>")
/obj/item/weapon/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj)
/obj/item/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj)
to_chat(user, "<span class='warning'>The [name] is not ready yet.<span>")
/obj/item/weapon/gun/magic/tentacle/suicide_act(mob/user)
/obj/item/gun/magic/tentacle/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] coils [src] tightly around [user.p_their()] neck! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return (OXYLOSS)
@@ -261,7 +261,7 @@
caliber = "tentacle"
icon_state = "tentacle_end"
firing_effect_type = null
var/obj/item/weapon/gun/magic/tentacle/gun //the item that shot it
var/obj/item/gun/magic/tentacle/gun //the item that shot it
/obj/item/ammo_casing/magic/tentacle/Initialize()
gun = loc
@@ -380,7 +380,7 @@
dna_cost = 1
req_human = 1
weapon_type = /obj/item/weapon/shield/changeling
weapon_type = /obj/item/shield/changeling
weapon_name_simple = "shield"
/obj/effect/proc_holder/changeling/weapon/shield/sting_action(mob/user)
@@ -388,15 +388,15 @@
if(!changeling)
return
var/obj/item/weapon/shield/changeling/S = ..(user)
var/obj/item/shield/changeling/S = ..(user)
S.remaining_uses = round(changeling.absorbedcount * 3)
return TRUE
/obj/item/weapon/shield/changeling
/obj/item/shield/changeling
name = "shield-like mass"
desc = "A mass of tough, boney tissue. You can still see the fingers as a twisted pattern in the shield."
flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1
icon = 'icons/obj/weapons.dmi'
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "ling_shield"
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
@@ -404,12 +404,12 @@
var/remaining_uses //Set by the changeling ability.
/obj/item/weapon/shield/changeling/Initialize()
/obj/item/shield/changeling/Initialize()
. = ..()
if(ismob(loc))
loc.visible_message("<span class='warning'>The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!</span>", "<span class='warning'>We inflate our hand into a strong shield.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
/obj/item/weapon/shield/changeling/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
/obj/item/shield/changeling/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(remaining_uses < 1)
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
@@ -444,7 +444,7 @@
icon_state = "lingspacesuit"
desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel."
flags_1 = STOPSPRESSUREDMAGE_1 | NODROP_1 | DROPDEL_1 //Not THICKMATERIAL_1 because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff)
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/weapon/tank/internals/oxygen)
allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/oxygen)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 90, acid = 90) //No armor at all.
/obj/item/clothing/suit/space/changeling/Initialize()
@@ -109,11 +109,11 @@
chemical_cost = 20
dna_cost = 1
/obj/item/weapon/melee/arm_blade/false
/obj/item/melee/arm_blade/false
desc = "A grotesque mass of flesh that used to be your arm. Although it looks dangerous at first, you can tell it's actually quite dull and useless."
force = 5 //Basically as strong as a punch
/obj/item/weapon/melee/arm_blade/false/afterattack(atom/target, mob/user, proximity)
/obj/item/melee/arm_blade/false/afterattack(atom/target, mob/user, proximity)
return
/obj/effect/proc_holder/changeling/sting/false_armblade/can_sting(mob/user, mob/target)
@@ -134,7 +134,7 @@
if(ismonkey(target))
to_chat(user, "<span class='notice'>Our genes cry out as we sting [target.name]!</span>")
var/obj/item/weapon/melee/arm_blade/false/blade = new(target,1)
var/obj/item/melee/arm_blade/false/blade = new(target,1)
target.put_in_hands(blade)
target.visible_message("<span class='warning'>A grotesque blade forms around [target.name]\'s arm!</span>", "<span class='userdanger'>Your arm twists and mutates, transforming into a horrific monstrosity!</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
playsound(target, 'sound/effects/blobattack.ogg', 30, 1)
@@ -142,7 +142,7 @@
addtimer(CALLBACK(src, .proc/remove_fake, target, blade), 600)
return TRUE
/obj/effect/proc_holder/changeling/sting/false_armblade/proc/remove_fake(mob/target, obj/item/weapon/melee/arm_blade/false/blade)
/obj/effect/proc_holder/changeling/sting/false_armblade/proc/remove_fake(mob/target, obj/item/melee/arm_blade/false/blade)
playsound(target, 'sound/effects/blobattack.ogg', 30, 1)
target.visible_message("<span class='warning'>With a sickening crunch, \
[target] reforms their [blade.name] into an arm!</span>",
@@ -11,9 +11,21 @@
var/stat_affected = CONSCIOUS
var/sigil_name = "Sigil"
var/resist_string = "glows blinding white" //string for when a null rod blocks its effects, "glows [resist_string]"
var/list/component_refund = list()
/obj/effect/clockwork/sigil/attackby(obj/item/I, mob/living/user, params)
if(I.force && !is_servant_of_ratvar(user))
if(is_servant_of_ratvar(user))
if(istype(I, /obj/item/clockwork/slab))
user.visible_message("<span class='warning'>[user] starts to dispel [src]...</span>", "<span class='danger'>You start to dispel [src]...</span>")
if(do_after(user, 20, target = src))
user.visible_message("<span class='warning'>[user] dispels [src]!</span>", "<span class='danger'>You dispel [src]!</span>")
for(var/i in component_refund)
if(component_refund[i])
for(var/r in 1 to component_refund[i])
generate_cache_component(i, src)
qdel(src)
return 1
else if(I.force)
user.visible_message("<span class='warning'>[user] scatters [src] with [I]!</span>", "<span class='danger'>You scatter [src] with [I]!</span>")
qdel(src)
return 1
@@ -63,6 +75,7 @@
light_power = 1
light_color = "#FAE48C"
sigil_name = "Sigil of Transgression"
component_refund = list(HIEROPHANT_ANSIBLE = 1)
/obj/effect/clockwork/sigil/transgression/sigil_effects(mob/living/L)
var/target_flashed = L.flash_act()
@@ -94,27 +107,33 @@
light_color = "#FAE48C"
stat_affected = UNCONSCIOUS
resist_string = "glows faintly yellow"
sigil_name = "Sigil of Submission"
component_refund = list(GEIS_CAPACITOR = 1)
var/convert_time = 80
var/delete_on_finish = TRUE
sigil_name = "Sigil of Submission"
var/glow_type = /obj/effect/temp_visual/ratvar/sigil/submission
/obj/effect/clockwork/sigil/submission/sigil_effects(mob/living/L)
if(istype(L.buckled, /obj/structure/destructible/clockwork/geis_binding))
if(is_servant_of_ratvar(L.pulledby))
L.pulledby.stop_pulling()
if(is_servant_of_ratvar(L.buckled.pulledby))
L.buckled.pulledby.stop_pulling()
L.visible_message("<span class='warning'>[src] begins to glow a piercing magenta!</span>", "<span class='sevtug'>You feel something start to invade your mind...</span>")
var/oldcolor = color
animate(src, color = "#AF0AAF", time = convert_time, flags_1 = ANIMATION_END_NOW)
animate(src, color = "#AF0AAF", time = convert_time, flags = ANIMATION_END_NOW)
var/obj/effect/temp_visual/ratvar/sigil/glow
if(glow_type)
glow = new glow_type(get_turf(src))
animate(glow, alpha = 255, time = convert_time)
var/I = 0
while(I < convert_time && get_turf(L) == get_turf(src))
while(I < convert_time && !QDELETED(L) && get_turf(L) == get_turf(src))
I++
sleep(1)
if(get_turf(L) != get_turf(src))
if(QDELETED(L) || get_turf(L) != get_turf(src))
if(glow)
qdel(glow)
animate(src, color = oldcolor, time = 20, flags_1 = ANIMATION_END_NOW)
animate(src, color = oldcolor, time = 20, flags = ANIMATION_END_NOW)
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 20)
visible_message("<span class='warning'>[src] slowly stops glowing!</span>")
return
@@ -136,7 +155,7 @@
to_chat(M, "<span class='heavy_brass'>[message] you!</span>")
else
to_chat(M, "<span class='heavy_brass'>[message] [L.real_name]!</span>")
animate(src, color = oldcolor, time = 20, flags_1 = ANIMATION_END_NOW)
animate(src, color = oldcolor, time = 20, flags = ANIMATION_END_NOW)
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 20)
visible_message("<span class='warning'>[src] slowly stops glowing!</span>")
@@ -152,6 +171,7 @@
light_color = "#EC8A2D"
resist_string = "glows faintly"
sigil_name = "Sigil of Transmission"
component_refund = list(HIEROPHANT_ANSIBLE = 1)
affects_servants = TRUE
var/power_charge = 0 //starts with no power
var/drain_range = 14
@@ -296,6 +316,7 @@
stat_affected = DEAD
resist_string = "glows shimmering yellow"
sigil_name = "Vitality Matrix"
component_refund = list(VANGUARD_COGWHEEL = 1)
var/revive_cost = 150
var/sigil_active = FALSE
var/animation_number = 3 //each cycle increments this by 1, at 4 it produces an animation and resets
@@ -314,7 +335,7 @@
if((is_servant_of_ratvar(L) && L.suiciding) || sigil_active)
return
visible_message("<span class='warning'>[src] begins to glow bright blue!</span>")
animate(src, alpha = 255, time = 10, flags_1 = ANIMATION_END_NOW) //we may have a previous animation going. finish it first, then do this one without delay.
animate(src, alpha = 255, time = 10, flags = ANIMATION_END_NOW) //we may have a previous animation going. finish it first, then do this one without delay.
sleep(10)
//as long as they're still on the sigil and are either not a servant or they're a servant AND it has remaining vitality
while(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && (GLOB.ratvar_awakens || GLOB.clockwork_vitality))) && get_turf(L) == get_turf(src))
@@ -380,4 +401,4 @@
animation_number = initial(animation_number)
sigil_active = FALSE
visible_message("<span class='warning'>[src] slowly stops glowing!</span>")
animate(src, alpha = initial(alpha), time = 10, flags_1 = ANIMATION_END_NOW)
animate(src, alpha = initial(alpha), time = 10, flags = ANIMATION_END_NOW)
@@ -80,7 +80,7 @@
return TRUE
/obj/effect/clockwork/spatial_gateway/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/weapon/nullrod))
if(istype(I, /obj/item/nullrod))
user.visible_message("<span class='warning'>[user] dispels [src] with [I]!</span>", "<span class='danger'>You close [src] with [I]!</span>")
qdel(linked_gateway)
qdel(src)
@@ -1,14 +1,14 @@
//horrifying power drain proc made for clockcult's power drain in lieu of six istypes or six for(x in view) loops
/atom/movable/proc/power_drain(clockcult_user)
var/obj/item/weapon/stock_parts/cell/cell = get_cell()
var/obj/item/stock_parts/cell/cell = get_cell()
if(cell)
return cell.power_drain(clockcult_user)
return 0
/obj/item/weapon/melee/baton/power_drain(clockcult_user) //balance memes
/obj/item/melee/baton/power_drain(clockcult_user) //balance memes
return 0
/obj/item/weapon/gun/power_drain(clockcult_user) //balance memes
/obj/item/gun/power_drain(clockcult_user) //balance memes
return 0
/obj/machinery/power/apc/power_drain(clockcult_user)
@@ -34,7 +34,7 @@
visible_message("<span class='warning'>[src]'s panel flies open with a flurry of sparks!</span>")
update_icon()
/obj/item/weapon/stock_parts/cell/power_drain(clockcult_user)
/obj/item/stock_parts/cell/power_drain(clockcult_user)
if(charge)
. = min(charge, MIN_CLOCKCULT_POWER*3)
charge = use(.)
@@ -27,9 +27,6 @@
/turf/closed/wall/mineral/cult/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) //no metal
return list("operation_time" = 80, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = SOUTH)
/turf/closed/wall/shuttle/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) //two sheets of metal
return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2), "spawn_dir" = SOUTH)
/turf/closed/wall/r_wall/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent)
return FALSE
@@ -24,15 +24,10 @@
//For the Geis scripture; binds a target to convert.
/obj/effect/proc_holder/slab/geis
ranged_mousepointer = 'icons/effects/geis_target.dmi'
var/obj/structure/destructible/clockwork/geis_binding/binding //we always have a reference to the binding
var/obj/structure/destructible/clockwork/geis_binding/pulled_binding //we use this to see if we're pulling it or not
/obj/effect/proc_holder/slab/geis/remove_ranged_ability(msg)
..()
binding = null
pulled_binding = null
/obj/effect/proc_holder/slab/geis/InterceptClickOn(mob/living/caller, params, atom/target)
if(..())
return TRUE
var/turf/T = ranged_ability_user.loc
if(!isturf(T))
return TRUE
@@ -40,20 +35,6 @@
var/target_is_binding = istype(target, /obj/structure/destructible/clockwork/geis_binding)
if((target_is_binding || isliving(target)) && ranged_ability_user.Adjacent(target))
if(in_progress || ..())
var/mob/living/L = target
if(!pulled_binding)
if(target == binding || (isliving(target) && L.buckled == binding))
pulled_binding = binding
ranged_ability_user.start_pulling(binding)
remove_mousepointer(ranged_ability_user.client)
ranged_mousepointer = 'icons/effects/geis_target_remove.dmi'
add_mousepointer(ranged_ability_user.client)
else if(target == pulled_binding || (isliving(target) && L.buckled == pulled_binding))
ranged_ability_user.visible_message("<span class='warning'>[ranged_ability_user] dispels [pulled_binding]!</span>", "<span class='danger'>You dispel the binding!</span>")
binding.take_damage(obj_integrity)
remove_ranged_ability()
return TRUE
if(target_is_binding)
var/obj/structure/destructible/clockwork/geis_binding/GB = target
GB.repair_and_interrupt()
@@ -80,42 +61,19 @@
add_logs(ranged_ability_user, L, "rebound with Geis")
successful = TRUE
else
in_progress = TRUE
clockwork_say(ranged_ability_user, text2ratvar("Be bound, heathen!"))
remove_mousepointer(ranged_ability_user.client)
ranged_mousepointer = 'icons/effects/geis_target_remove.dmi'
add_mousepointer(ranged_ability_user.client)
add_logs(ranged_ability_user, L, "bound with Geis")
playsound(target, 'sound/magic/blink.ogg', 50, TRUE, frequency = 0.5)
playsound(target, 'sound/magic/blink.ogg', 50, TRUE, -4, frequency = 0.5)
if(slab.speed_multiplier >= 0.5) //excuse my debug...
ranged_ability_user.notransform = TRUE
addtimer(CALLBACK(src, .proc/reset_user_notransform, ranged_ability_user), 5) //stop us moving for a little bit so we don't break the binding immediately
addtimer(CALLBACK(src, .proc/reset_user_notransform, ranged_ability_user), 4) //stop us moving for a little bit so we don't break the binding immediately
if(L.buckled)
L.buckled.unbuckle_mob(target, TRUE)
binding = new(get_turf(target))
var/obj/structure/destructible/clockwork/geis_binding/binding = new(get_turf(target))
binding.setDir(target.dir)
binding.buckle_mob(target, TRUE)
pulled_binding = binding
ranged_ability_user.start_pulling(binding)
slab.busy = "sustaining Geis"
slab.flags_1 |= NODROP_1
while(!QDELETED(binding) && !QDELETED(ranged_ability_user))
if(ranged_ability_user.pulling == binding)
pulled_binding = binding
if(ranged_ability_user.client && ranged_ability_user.client.mouse_pointer_icon == 'icons/effects/geis_target.dmi')
remove_mousepointer(ranged_ability_user.client)
ranged_mousepointer = 'icons/effects/geis_target_remove.dmi'
add_mousepointer(ranged_ability_user.client)
else //if we're not pulling it, swap our mousepointer
pulled_binding = null
if(ranged_ability_user.client && ranged_ability_user.client.mouse_pointer_icon == 'icons/effects/geis_target_remove.dmi')
remove_mousepointer(ranged_ability_user.client)
ranged_mousepointer = 'icons/effects/geis_target.dmi'
add_mousepointer(ranged_ability_user.client)
sleep(1)
if(!QDELETED(slab))
slab.flags_1 &= ~NODROP_1
in_progress = FALSE
ranged_ability_user.apply_status_effect(STATUS_EFFECT_GEISTRACKER, binding)
successful = TRUE
remove_ranged_ability()
@@ -15,7 +15,7 @@
to_chat(user, "<span class='[message_span]'>[cultist_message]</span>")
if(user.mind && user.mind.isholy)
to_chat(user, "<span class='boldannounce'>The power of your faith melts away the [src]!</span>")
var/obj/item/weapon/ore/slag/wrath = new /obj/item/weapon/ore/slag
var/obj/item/ore/slag/wrath = new /obj/item/ore/slag
qdel(src)
user.put_in_active_hand(wrath)
if(is_servant_of_ratvar(user) && prob(20))
@@ -144,7 +144,7 @@
to_chat(user, "<span class='brass'>You use [stored_power ? "some":"all"] of [src]'s power to produce <b>5</b> brass sheets. It now stores <b>[get_power()]W/[get_max_power()]W</b> of power.</span>")
/obj/item/clockwork/replica_fabricator/pre_attackby(atom/target, mob/living/user, params)
if(!target || !user || !is_servant_of_ratvar(user) || istype(target, /obj/item/weapon/storage))
if(!target || !user || !is_servant_of_ratvar(user) || istype(target, /obj/item/storage))
return TRUE
return fabricate(target, user)
@@ -156,7 +156,7 @@
/mob/living/simple_animal/hostile/clockwork/marauder/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
if(amount > 0)
for(var/mob/living/L in view(2, src))
if(L.is_holding_item_of_type(/obj/item/weapon/nullrod))
if(L.is_holding_item_of_type(/obj/item/nullrod))
to_chat(src, "<span class='userdanger'>The presence of a brandished holy artifact weakens your armor!</span>")
amount *= 4 //if a wielded null rod is nearby, it takes four times the health damage
break
@@ -258,7 +258,7 @@
return ..()
/mob/living/simple_animal/hostile/clockwork/marauder/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/nullrod) || !blockOrCounter(user, I))
if(istype(I, /obj/item/nullrod) || !blockOrCounter(user, I))
return ..()
/mob/living/simple_animal/hostile/clockwork/marauder/proc/blockOrCounter(mob/target, atom/textobject)
@@ -57,6 +57,9 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
if(slab.busy)
to_chat(invoker, "<span class='warning'>[slab] refuses to work, displaying the message: \"[slab.busy]!\"</span>")
return FALSE
if(invoker.has_status_effect(STATUS_EFFECT_GEISTRACKER))
to_chat(invoker, "<span class='warning'>[slab] refuses to work, displaying the message: \"Sustaining Geis!\"</span>")
return FALSE
slab.busy = "Invocation ([name]) in progress"
if(GLOB.ratvar_awakens)
channel_time *= 0.5 //if ratvar has awoken, half channel time and no cost
@@ -99,7 +99,7 @@
return ..()
/obj/structure/destructible/clockwork/attackby(obj/item/I, mob/user, params)
if(is_servant_of_ratvar(user) && istype(I, /obj/item/weapon/wrench) && unanchored_icon)
if(is_servant_of_ratvar(user) && istype(I, /obj/item/wrench) && unanchored_icon)
if(default_unfasten_wrench(user, I, 50) == SUCCESSFUL_UNFASTEN)
update_anchored(user)
return 1
@@ -2,8 +2,8 @@
/obj/structure/destructible/clockwork/geis_binding
name = "glowing ring"
desc = "A flickering, glowing purple ring around a target."
clockwork_desc = "A binding ring around a target, preventing them from taking action while they're being converted."
max_integrity = 25
clockwork_desc = "A binding ring around a target, preventing them from taking action."
max_integrity = 20
light_range = 2
light_power = 0.8
light_color = "#AF0AAF"
@@ -18,6 +18,8 @@
can_buckle = TRUE
buckle_lying = 0
var/mob_layer = MOB_LAYER
var/last_mob_health = 0
var/apply_time = 0
/obj/structure/destructible/clockwork/geis_binding/Initialize(mapload, obj/item/clockwork/slab/the_slab)
. = ..()
@@ -33,21 +35,39 @@
icon_state = "geisbinding"
/obj/structure/destructible/clockwork/geis_binding/process()
var/tick_damage = 1
if(locate(/obj/effect/clockwork/sigil/submission) in loc)
tick_damage *= 0.5
if(LAZYLEN(buckled_mobs))
for(var/V in buckled_mobs)
var/mob/living/L = V
if(is_servant_of_ratvar(L)) //servants are freed automatically
take_damage(obj_integrity)
return
var/tick_damage = 1
if(!is_servant_of_ratvar(pulledby))
tick_damage++
if(last_mob_health > L.health)
tick_damage += last_mob_health - L.health
last_mob_health = L.health
if(L.layer != mob_layer)
mob_layer = L.layer
layer = mob_layer - 0.01
cut_overlays()
add_overlay(mutable_appearance('icons/effects/clockwork_effects.dmi', "geisbinding_top", mob_layer + 0.01))
break
take_damage(tick_damage, sound_effect = FALSE)
playsound(src, 'sound/effects/empulse.ogg', tick_damage * 20, TRUE)
playsound(src, 'sound/effects/empulse.ogg', tick_damage * 40, TRUE, -4)
/obj/structure/destructible/clockwork/geis_binding/attack_hand(mob/living/user)
return
/obj/structure/destructible/clockwork/geis_binding/attackby(obj/item/I, mob/user, params)
if(is_servant_of_ratvar(user) && istype(I, /obj/item/clockwork/slab))
user.visible_message("<span class='warning'>[user] starts to dispel [src]...</span>", "<span class='danger'>You start to dispel [src]...</span>")
if(do_after(user, 30, target = src))
user.visible_message("<span class='warning'>[user] dispels [src]!</span>", "<span class='danger'>You dispel [src]!</span>")
take_damage(obj_integrity)
return 1
return ..()
/obj/structure/destructible/clockwork/geis_binding/emp_act(severity)
new /obj/effect/temp_visual/emp(loc)
qdel(src)
@@ -56,16 +76,22 @@
..()
if(M.buckled == src)
desc = "A flickering, glowing purple ring around [M]."
clockwork_desc = "A binding ring around [M], preventing [M.p_them()] from taking action while [M.p_theyre()] being converted."
clockwork_desc = "A binding ring around [M], preventing [M.p_them()] from taking action."
icon_state = "geisbinding"
mob_layer = M.layer
layer = M.layer - 0.01
add_overlay(mutable_appearance('icons/effects/clockwork_effects.dmi', "geisbinding_top", M.layer + 0.01))
layer = mob_layer - 0.01
add_overlay(mutable_appearance('icons/effects/clockwork_effects.dmi', "geisbinding_top", mob_layer + 0.01))
last_mob_health = M.health
apply_time = world.time
for(var/obj/item/I in M.held_items)
M.dropItemToGround(I)
for(var/i in M.get_empty_held_indexes())
var/obj/item/geis_binding/B = new(M)
M.put_in_hands(B, i)
if(iscarbon(M))
var/mob/living/carbon/C = M
if(!C.handcuffed)
C.handcuffed = new /obj/item/restraints/handcuffs/energy/clock(C)
M.regenerate_icons()
M.visible_message("<span class='warning'>A [name] appears around [M]!</span>", "<span class='warning'>A [name] appears around you!</span>")
repair_and_interrupt()
@@ -79,8 +105,17 @@
animate(G, transform = matrix()*2, alpha = 0, time = 8, easing = EASE_OUT)
animate(T, transform = matrix()*2, alpha = 0, time = 8, easing = EASE_OUT)
M.visible_message("<span class='warning'>[src] snaps into glowing pieces and dissipates!</span>")
M.AdjustStun(-130 + (apply_time - world.time), 1, 1) //remove exactly as much stun as was applied
if(iscarbon(M))
var/mob/living/carbon/C = M
C.silent = max(C.silent - 7, 0)
for(var/obj/item/geis_binding/GB in M.held_items)
M.dropItemToGround(GB, TRUE)
if(iscarbon(M))
var/mob/living/carbon/C = M
if(istype(C.handcuffed, /obj/item/restraints/handcuffs/energy/clock))
QDEL_NULL(C.handcuffed)
C.update_handcuffed()
/obj/structure/destructible/clockwork/geis_binding/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
playsound(src, 'sound/effects/empulse.ogg', 50, 1)
@@ -130,3 +165,10 @@
/obj/item/geis_binding/pre_attackby(atom/target, mob/living/user, params)
return FALSE
/obj/item/restraints/handcuffs/energy/clock
name = "glowing rings"
desc = "Flickering rings preventing you from holding items."
icon = 'icons/effects/clockwork_effects.dmi'
icon_state = "geisbinding_full"
flags_1 = NODROP_1|ABSTRACT_1|DROPDEL_1
@@ -126,7 +126,7 @@
if(O.emped || !O.on)
continue
O.emp_act(EMP_HEAVY)
else if((isliving(A) && !is_servant_of_ratvar(A)) || istype(A, /obj/structure/closet) || istype(A, /obj/item/weapon/storage)) //other things may have radios in them but we don't care
else if((isliving(A) && !is_servant_of_ratvar(A)) || istype(A, /obj/structure/closet) || istype(A, /obj/item/storage)) //other things may have radios in them but we don't care
for(var/obj/item/device/radio/O in A.GetAllContents())
successfulprocess = TRUE
if(O.emped || !O.on)
@@ -102,11 +102,11 @@
/obj/structure/destructible/clockwork/ocular_warden/proc/acquire_nearby_targets()
. = list()
for(var/mob/living/L in viewers(sight_range, src)) //Doesn't attack the blind
var/obj/item/weapon/storage/book/bible/B = L.bible_check()
var/obj/item/storage/book/bible/B = L.bible_check()
if(B)
if(!(B.resistance_flags & ON_FIRE))
to_chat(L, "<span class='warning'>Your [B.name] bursts into flames!</span>")
for(var/obj/item/weapon/storage/book/bible/BI in L.GetAllContents())
for(var/obj/item/storage/book/bible/BI in L.GetAllContents())
if(!(BI.resistance_flags & ON_FIRE))
BI.fire_act()
continue
@@ -24,10 +24,10 @@
return
/obj/structure/destructible/clockwork/wall_gear/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/wrench))
if(istype(I, /obj/item/wrench))
default_unfasten_wrench(user, I, 10)
return 1
else if(istype(I, /obj/item/weapon/screwdriver))
else if(istype(I, /obj/item/screwdriver))
if(anchored)
to_chat(user, "<span class='warning'>[src] needs to be unsecured to disassemble it!</span>")
else
+3 -3
View File
@@ -125,9 +125,9 @@
mob.dna.remove_mutation(CLOWNMUT)
if(tome)
. += cult_give_item(/obj/item/weapon/tome, mob)
. += cult_give_item(/obj/item/tome, mob)
else
. += cult_give_item(/obj/item/weapon/paper/talisman/supply, mob)
. += cult_give_item(/obj/item/paper/talisman/supply, mob)
to_chat(mob, "These will help you start the cult on this station. Use them well, and remember - you are not the only one.</span>")
/datum/game_mode/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob)
@@ -146,7 +146,7 @@
else
to_chat(mob, "<span class='danger'>You have a [item_name] in your [where].")
if(where == "backpack")
var/obj/item/weapon/storage/B = mob.back
var/obj/item/storage/B = mob.back
B.orient2hud(mob)
B.show_to(mob)
return 1
+15 -15
View File
@@ -1,4 +1,4 @@
/obj/item/weapon/melee/cultblade
/obj/item/melee/cultblade
name = "eldritch longsword"
desc = "A sword humming with unholy energy. It glows with a dim red light."
icon_state = "cultblade"
@@ -14,7 +14,7 @@
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended")
/obj/item/weapon/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user)
/obj/item/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user)
if(!iscultist(user))
user.Knockdown(100)
user.dropItemToGround(src, TRUE)
@@ -28,12 +28,12 @@
return
..()
/obj/item/weapon/melee/cultblade/ghost
/obj/item/melee/cultblade/ghost
name = "eldritch sword"
force = 19 //can't break normal airlocks
flags_1 = NODROP_1|DROPDEL_1
/obj/item/weapon/melee/cultblade/pickup(mob/living/user)
/obj/item/melee/cultblade/pickup(mob/living/user)
..()
if(!iscultist(user))
if(!is_servant_of_ratvar(user))
@@ -47,7 +47,7 @@
user.apply_damage(30, BRUTE, pick("l_arm", "r_arm"))
user.dropItemToGround(src)
/obj/item/weapon/melee/cultblade/dagger
/obj/item/melee/cultblade/dagger
name = "sacrificial dagger"
desc = "A strange dagger said to be used by sinister groups for \"preparing\" a corpse before sacrificing it to their dark gods."
icon = 'icons/obj/wizard.dmi'
@@ -57,7 +57,7 @@
throwforce = 25
embed_chance = 75
/obj/item/weapon/melee/cultblade/dagger/attack(mob/living/target, mob/living/carbon/human/user)
/obj/item/melee/cultblade/dagger/attack(mob/living/target, mob/living/carbon/human/user)
..()
if(iscarbon(target))
var/mob/living/carbon/C = target
@@ -66,7 +66,7 @@
C.reagents.add_reagent("heparin", 1)
/obj/item/weapon/restraints/legcuffs/bola/cult
/obj/item/restraints/legcuffs/bola/cult
name = "nar'sien bola"
desc = "A strong bola, bound with dark magic. Throw it to trip and slow your victim."
icon_state = "bola_cult"
@@ -92,7 +92,7 @@
icon_state = "cultrobes"
item_state = "cultrobes"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade)
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0, fire = 10, acid = 10)
flags_inv = HIDEJUMPSUIT
cold_protection = CHEST|GROIN|LEGS|ARMS
@@ -135,7 +135,7 @@
icon_state = "magusred"
item_state = "magusred"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade)
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0, fire = 10, acid = 10)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
@@ -154,11 +154,11 @@
item_state = "cult_armor"
desc = "A heavily-armored exosuit worn by warriors of the Nar-Sien cult. It can withstand hard vacuum."
w_class = WEIGHT_CLASS_SMALL
allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade, /obj/item/weapon/tank/internals/)
allowed = list(/obj/item/tome, /obj/item/melee/cultblade, /obj/item/tank/internals/)
armor = list(melee = 70, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 40, acid = 75)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/cult
/obj/item/weapon/sharpener/cult
/obj/item/sharpener/cult
name = "eldritch whetstone"
desc = "A block, empowered by dark magic. Sharp weapons will be enhanced when used on the stone."
icon_state = "cult_sharpener"
@@ -167,7 +167,7 @@
max = 40
prefix = "darkened"
/obj/item/weapon/sharpener/cult/update_icon()
/obj/item/sharpener/cult/update_icon()
icon_state = "cult_sharpener[used ? "_used" : ""]"
/obj/item/clothing/suit/hooded/cultrobes/cult_shield
@@ -178,7 +178,7 @@
w_class = WEIGHT_CLASS_BULKY
armor = list(melee = 50, bullet = 40, laser = 50,energy = 30, bomb = 50, bio = 30, rad = 30, fire = 50, acid = 60)
body_parts_covered = CHEST|GROIN|LEGS|ARMS
allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade)
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
var/current_charges = 3
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie
@@ -228,7 +228,7 @@
icon_state = "cultrobes"
item_state = "cultrobes"
flags_inv = HIDEJUMPSUIT
allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade)
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
body_parts_covered = CHEST|GROIN|LEGS|ARMS
armor = list(melee = -50, bullet = -50, laser = -50,energy = -50, bomb = -50, bio = -50, rad = -50, fire = 0, acid = 0)
slowdown = -1
@@ -275,7 +275,7 @@
user.Knockdown(100)
user.blind_eyes(30)
/obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater
/obj/item/reagent_containers/food/drinks/bottle/unholywater
name = "flask of unholy water"
desc = "Toxic to nonbelievers; reinvigorating to the faithful - this flask may be sipped or thrown."
icon_state = "holyflask"
+4 -4
View File
@@ -33,7 +33,7 @@
..()
/obj/structure/destructible/cult/attackby(obj/I, mob/user, params)
if(istype(I, /obj/item/weapon/tome) && iscultist(user))
if(istype(I, /obj/item/tome) && iscultist(user))
anchored = !anchored
to_chat(user, "<span class='notice'>You [anchored ? "":"un"]secure \the [src] [anchored ? "to":"from"] the floor.</span>")
if(!anchored)
@@ -78,11 +78,11 @@
var/pickedtype
switch(choice)
if("Eldritch Whetstone")
pickedtype = /obj/item/weapon/sharpener/cult
pickedtype = /obj/item/sharpener/cult
if("Zealot's Blindfold")
pickedtype = /obj/item/clothing/glasses/night/cultblind
if("Flask of Unholy Water")
pickedtype = /obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater
pickedtype = /obj/item/reagent_containers/food/drinks/bottle/unholywater
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
cooldowntime = world.time + 2400
var/obj/item/N = new pickedtype(get_turf(src))
@@ -218,7 +218,7 @@
var/list/pickedtype = list()
switch(choice)
if("Supply Talisman")
pickedtype += /obj/item/weapon/paper/talisman/supply/weak
pickedtype += /obj/item/paper/talisman/supply/weak
if("Shuttle Curse")
pickedtype += /obj/item/device/shuttle_curse
if("Veil Walker Set")
+9 -9
View File
@@ -5,7 +5,7 @@ This file contains the arcane tome files.
*/
/obj/item/weapon/tome
/obj/item/tome
name = "arcane tome"
desc = "An old, dusty tome with frayed edges and a sinister-looking cover."
icon_state ="tome"
@@ -13,7 +13,7 @@ This file contains the arcane tome files.
throw_range = 5
w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/tome/Initialize()
/obj/item/tome/Initialize()
. = ..()
if(!LAZYLEN(GLOB.rune_types))
GLOB.rune_types = list()
@@ -22,7 +22,7 @@ This file contains the arcane tome files.
var/obj/effect/rune/R = i_can_do_loops_now_thanks_remie
GLOB.rune_types[initial(R.cultist_name)] = R //Uses the cultist name for displaying purposes
/obj/item/weapon/tome/examine(mob/user)
/obj/item/tome/examine(mob/user)
..()
if(iscultist(user) || isobserver(user))
to_chat(user, "<span class='cult'>The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar-Sie.</span>")
@@ -30,7 +30,7 @@ This file contains the arcane tome files.
to_chat(user, "<span class='cult'>Striking another cultist with it will purge holy water from them.</span>")
to_chat(user, "<span class='cult'>Striking a noncultist, however, will sear their flesh.</span>")
/obj/item/weapon/tome/attack(mob/living/M, mob/living/user)
/obj/item/tome/attack(mob/living/M, mob/living/user)
if(!istype(M))
return
if(!iscultist(user))
@@ -51,13 +51,13 @@ This file contains the arcane tome files.
user.do_attack_animation(M)
add_logs(user, M, "smacked", src)
/obj/item/weapon/tome/attack_self(mob/user)
/obj/item/tome/attack_self(mob/user)
if(!iscultist(user))
to_chat(user, "<span class='warning'>[src] seems full of unintelligible shapes, scribbles, and notes. Is this some sort of joke?</span>")
return
open_tome(user)
/obj/item/weapon/tome/proc/open_tome(mob/user)
/obj/item/tome/proc/open_tome(mob/user)
var/choice = alert(user,"You open the tome...",,"Scribe Rune","More Information","Cancel")
switch(choice)
if("More Information")
@@ -67,7 +67,7 @@ This file contains the arcane tome files.
if("Cancel")
return
/obj/item/weapon/tome/proc/read_tome(mob/user)
/obj/item/tome/proc/read_tome(mob/user)
var/text = ""
text += "<center><font color='red' size=3><b><i>Archives of the Dark One</i></b></font></center><br><br><br>"
text += "A rune's name and effects can be revealed by examining the rune.<br><br>"
@@ -171,7 +171,7 @@ This file contains the arcane tome files.
popup.open()
return 1
/obj/item/weapon/tome/proc/scribe_rune(mob/living/user)
/obj/item/tome/proc/scribe_rune(mob/living/user)
var/turf/Turf = get_turf(user)
var/chosen_keyword
var/obj/effect/rune/rune_to_scribe
@@ -248,7 +248,7 @@ This file contains the arcane tome files.
to_chat(user, "<span class='cult'>The [lowertext(R.cultist_name)] rune [R.cultist_desc]</span>")
SSblackbox.add_details("cult_runes_scribed", R.cultist_name)
/obj/item/weapon/tome/proc/check_rune_turf(turf/T, mob/user)
/obj/item/tome/proc/check_rune_turf(turf/T, mob/user)
if(isspaceturf(T))
to_chat(user, "<span class='warning'>You cannot scribe runes in space!</span>")
return FALSE
+15 -15
View File
@@ -56,10 +56,10 @@ To draw a rune, use an arcane tome.
to_chat(user, "<b>Keyword:</b> [keyword]")
/obj/effect/rune/attackby(obj/I, mob/user, params)
if(istype(I, /obj/item/weapon/tome) && iscultist(user))
if(istype(I, /obj/item/tome) && iscultist(user))
to_chat(user, "<span class='notice'>You carefully erase the [lowertext(cultist_name)] rune.</span>")
qdel(src)
else if(istype(I, /obj/item/weapon/nullrod))
else if(istype(I, /obj/item/nullrod))
user.say("BEGONE FOUL MAGIKS!!")
to_chat(user, "<span class='danger'>You disrupt the magic of [src] with [I].</span>")
qdel(src)
@@ -175,13 +175,13 @@ structure_check() searches for nearby cultist structures required for the invoca
qdel(src)
/mob/proc/null_rod_check() //The null rod, if equipped, will protect the holder from the effects of most runes
var/obj/item/weapon/nullrod/N = locate() in src
var/obj/item/nullrod/N = locate() in src
if(N && !GLOB.ratvar_awakens) //If Nar-Sie or Ratvar are alive, null rods won't protect you
return N
return 0
/mob/proc/bible_check() //The bible, if held, might protect against certain things
var/obj/item/weapon/storage/book/bible/B = locate() in src
var/obj/item/storage/book/bible/B = locate() in src
if(is_holding(B))
return B
return 0
@@ -198,7 +198,7 @@ structure_check() searches for nearby cultist structures required for the invoca
var/mob/living/user = invokers[1] //the first invoker is always the user
var/list/papers_on_rune = checkpapers()
var/entered_talisman_name
var/obj/item/weapon/paper/talisman/talisman_type
var/obj/item/paper/talisman/talisman_type
var/list/possible_talismans = list()
if(!papers_on_rune.len)
to_chat(user, "<span class='cultitalic'>There must be a blank paper on top of [src]!</span>")
@@ -211,8 +211,8 @@ structure_check() searches for nearby cultist structures required for the invoca
log_game("Talisman Creation rune failed - already in use")
return
for(var/I in subtypesof(/obj/item/weapon/paper/talisman) - /obj/item/weapon/paper/talisman/malformed - /obj/item/weapon/paper/talisman/supply - /obj/item/weapon/paper/talisman/supply/weak - /obj/item/weapon/paper/talisman/summon_tome)
var/obj/item/weapon/paper/talisman/J = I
for(var/I in subtypesof(/obj/item/paper/talisman) - /obj/item/paper/talisman/malformed - /obj/item/paper/talisman/supply - /obj/item/paper/talisman/supply/weak - /obj/item/paper/talisman/summon_tome)
var/obj/item/paper/talisman/J = I
var/talisman_cult_name = initial(J.cultist_name)
if(talisman_cult_name)
possible_talismans[talisman_cult_name] = J //This is to allow the menu to let cultists select talismans by name
@@ -226,7 +226,7 @@ structure_check() searches for nearby cultist structures required for the invoca
fail_invoke()
log_game("Talisman Creation rune failed - no blank papers on rune")
return
var/obj/item/weapon/paper/paper_to_imbue = papers_on_rune[1]
var/obj/item/paper/paper_to_imbue = papers_on_rune[1]
..()
visible_message("<span class='warning'>Dark power begins to channel into the paper!</span>")
rune_in_use = TRUE
@@ -238,8 +238,8 @@ structure_check() searches for nearby cultist structures required for the invoca
/obj/effect/rune/imbue/proc/checkpapers()
. = list()
for(var/obj/item/weapon/paper/P in get_turf(src))
if(!P.info && !istype(P, /obj/item/weapon/paper/talisman))
for(var/obj/item/paper/P in get_turf(src))
if(!P.info && !istype(P, /obj/item/paper/talisman))
. |= P
/obj/effect/rune/teleport
@@ -388,7 +388,7 @@ structure_check() searches for nearby cultist structures required for the invoca
[brutedamage || burndamage ? "even as [convertee.p_their()] wounds heal and close" : "as the markings below [convertee.p_them()] glow a bloody red"]!</span>", \
"<span class='cultlarge'><i>AAAAAAAAAAAAAA-</i></span>")
SSticker.mode.add_cultist(convertee.mind, 1)
new /obj/item/weapon/tome(get_turf(src))
new /obj/item/tome(get_turf(src))
convertee.mind.special_role = "Cultist"
to_chat(convertee, "<span class='cultitalic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
and something evil takes root.</b></span>")
@@ -485,14 +485,14 @@ structure_check() searches for nearby cultist structures required for the invoca
new /obj/singularity/narsie/large/cult(T) //Causes Nar-Sie to spawn even if the rune has been removed
/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
if((istype(I, /obj/item/weapon/tome) && iscultist(user)))
if((istype(I, /obj/item/tome) && iscultist(user)))
user.visible_message("<span class='warning'>[user.name] begins erasing the [src]...</span>", "<span class='notice'>You begin erasing the [src]...</span>")
if(do_after(user, 50, target = src)) //Prevents accidental erasures.
log_game("Summon Narsie rune erased by [user.mind.key] (ckey) with a tome")
message_admins("[key_name_admin(user)] erased a Narsie rune with a tome")
..()
else
if(istype(I, /obj/item/weapon/nullrod)) //Begone foul magiks. You cannot hinder me.
if(istype(I, /obj/item/nullrod)) //Begone foul magiks. You cannot hinder me.
log_game("Summon Narsie rune erased by [user.mind.key] (ckey) using a null rod")
message_admins("[key_name_admin(user)] erased a Narsie rune with a null rod")
..()
@@ -842,7 +842,7 @@ structure_check() searches for nearby cultist structures required for the invoca
set_light(6, 1, color)
for(var/mob/living/L in viewers(T))
if(!iscultist(L) && L.blood_volume)
var/obj/item/weapon/nullrod/N = L.null_rod_check()
var/obj/item/nullrod/N = L.null_rod_check()
if(N)
to_chat(L, "<span class='userdanger'>\The [N] suddenly burns hotly before returning to normal!</span>")
continue
@@ -871,7 +871,7 @@ structure_check() searches for nearby cultist structures required for the invoca
set_light(6, 1, color)
for(var/mob/living/L in viewers(T))
if(!iscultist(L) && L.blood_volume)
var/obj/item/weapon/nullrod/N = L.null_rod_check()
var/obj/item/nullrod/N = L.null_rod_check()
if(N)
continue
L.take_overall_damage(tick_damage*multiplier, tick_damage*multiplier)
+10 -10
View File
@@ -1,5 +1,5 @@
//Supply Talisman: Has a few unique effects. Granted only to starter cultists.
/obj/item/weapon/paper/talisman/supply
/obj/item/paper/talisman/supply
cultist_name = "Supply Talisman"
cultist_desc = "A multi-use talisman that can create various objects. Intended to increase the cult's strength early on."
invocation = null
@@ -15,7 +15,7 @@
/datum/cult_supply/construct_shell
)
/obj/item/weapon/paper/talisman/supply/invoke(mob/living/user, successfuluse = 1)
/obj/item/paper/talisman/supply/invoke(mob/living/user, successfuluse = 1)
var/list/dat = list()
dat += "<B>There are [uses] bloody runes on the parchment.</B><BR>"
dat += "Please choose the chant to be imbued into the fabric of reality.<BR>"
@@ -28,7 +28,7 @@
popup.open()
return 0
/obj/item/weapon/paper/talisman/supply/Topic(href, href_list)
/obj/item/paper/talisman/supply/Topic(href, href_list)
if(QDELETED(src) || usr.incapacitated() || !in_range(src, usr))
return
@@ -58,11 +58,11 @@
to_chat(usr, "<span class='warning'>[src] crumbles to dust.</span>")
burn()
/obj/item/weapon/paper/talisman/supply/weak
/obj/item/paper/talisman/supply/weak
cultist_name = "Lesser Supply Talisman"
uses = 2
/obj/item/weapon/paper/talisman/supply/weak/Initialize(mapload)
/obj/item/paper/talisman/supply/weak/Initialize(mapload)
. = ..()
// no runed metal from lesser talismans.
possible_summons -= /datum/cult_supply/metal
@@ -77,7 +77,7 @@
id = "arcane_tome"
invocation = "N'ath reth sh'yro eth d'raggathnor!"
desc = "Summons an arcane tome, used to scribe runes."
summon_type = /obj/item/weapon/tome
summon_type = /obj/item/tome
/datum/cult_supply/metal
id = "runed_metal"
@@ -89,25 +89,25 @@
id = "teleport_talisman"
invocation = "Sas'so c'arta forbici!"
desc = "Allows you to move to a selected teleportation rune."
summon_type = /obj/item/weapon/paper/talisman/teleport
summon_type = /obj/item/paper/talisman/teleport
/datum/cult_supply/talisman/emp
id = "emp_talisman"
invocation = "Ta'gh fara'qha fel d'amar det!"
desc = "Allows you to destroy technology in a short range."
summon_type = /obj/item/weapon/paper/talisman/emp
summon_type = /obj/item/paper/talisman/emp
/datum/cult_supply/talisman/stun
id = "stun_talisman"
invocation = "Fuu ma'jin!"
desc = "Allows you to stun a person by attacking them with the talisman. Does not work on people holding a holy weapon!"
summon_type = /obj/item/weapon/paper/talisman/stun
summon_type = /obj/item/paper/talisman/stun
/datum/cult_supply/talisman/veil
id = "veil_talisman"
invocation = "Kla'atu barada nikt'o!"
desc = "Two use talisman, first use makes all nearby runes invisible, secnd use reveals nearby hidden runes."
summon_type = /obj/item/weapon/paper/talisman/true_sight
summon_type = /obj/item/paper/talisman/true_sight
/datum/cult_supply/soulstone
id = "soulstone"
+39 -39
View File
@@ -1,4 +1,4 @@
/obj/item/weapon/paper/talisman
/obj/item/paper/talisman
var/cultist_name = "talisman"
var/cultist_desc = "A basic talisman. It serves no purpose."
var/invocation = "Naise meam!"
@@ -6,7 +6,7 @@
var/health_cost = 0 //The amount of health taken from the user when invoking the talisman
var/creation_time = 100 //how long it takes an imbue rune to make this type of talisman
/obj/item/weapon/paper/talisman/examine(mob/user)
/obj/item/paper/talisman/examine(mob/user)
if(iscultist(user) || user.stat == DEAD)
to_chat(user, "<b>Name:</b> [cultist_name]")
to_chat(user, "<b>Effect:</b> [cultist_desc]")
@@ -14,7 +14,7 @@
else
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
/obj/item/weapon/paper/talisman/attack_self(mob/living/user)
/obj/item/paper/talisman/attack_self(mob/living/user)
if(!iscultist(user))
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
return
@@ -24,7 +24,7 @@
user.drop_item()
qdel(src)
/obj/item/weapon/paper/talisman/proc/invoke(mob/living/user, successfuluse = 1)
/obj/item/paper/talisman/proc/invoke(mob/living/user, successfuluse = 1)
. = successfuluse
if(successfuluse) //if the calling whatever says we succeed, do the fancy stuff
if(invocation)
@@ -34,19 +34,19 @@
C.apply_damage(health_cost, BRUTE, pick("l_arm", "r_arm"))
//Malformed Talisman: If something goes wrong.
/obj/item/weapon/paper/talisman/malformed
/obj/item/paper/talisman/malformed
cultist_name = "malformed talisman"
cultist_desc = "A talisman with gibberish scrawlings. No good can come from invoking this."
invocation = "Ra'sha yoka!"
/obj/item/weapon/paper/talisman/malformed/invoke(mob/living/user, successfuluse = 1)
/obj/item/paper/talisman/malformed/invoke(mob/living/user, successfuluse = 1)
to_chat(user, "<span class='cultitalic'>You feel a pain in your head. The Geometer is displeased.</span>")
if(iscarbon(user))
var/mob/living/carbon/C = user
C.apply_damage(10, BRUTE, "head")
//Rite of Translocation: Same as rune
/obj/item/weapon/paper/talisman/teleport
/obj/item/paper/talisman/teleport
cultist_name = "Talisman of Teleportation"
cultist_desc = "A single-use talisman that will teleport a user to a random rune of the same keyword."
color = RUNE_COLOR_TELEPORT
@@ -54,7 +54,7 @@
health_cost = 5
creation_time = 80
/obj/item/weapon/paper/talisman/teleport/invoke(mob/living/user, successfuluse = 1)
/obj/item/paper/talisman/teleport/invoke(mob/living/user, successfuluse = 1)
var/list/potential_runes = list()
var/list/teleportnames = list()
for(var/R in GLOB.teleport_runes)
@@ -86,7 +86,7 @@
return ..()
/obj/item/weapon/paper/talisman/summon_tome
/obj/item/paper/talisman/summon_tome
cultist_name = "Talisman of Tome Summoning"
cultist_desc = "A one-use talisman that will call an untranslated tome from the archives of the Geometer."
color = "#512727" // red-black
@@ -94,15 +94,15 @@
health_cost = 1
creation_time = 30
/obj/item/weapon/paper/talisman/summon_tome/invoke(mob/living/user, successfuluse = 1)
/obj/item/paper/talisman/summon_tome/invoke(mob/living/user, successfuluse = 1)
. = ..()
user.visible_message("<span class='warning'>[user]'s hand glows red for a moment.</span>", \
"<span class='cultitalic'>You speak the words of the talisman!</span>")
new /obj/item/weapon/tome(get_turf(user))
new /obj/item/tome(get_turf(user))
user.visible_message("<span class='warning'>A tome appears at [user]'s feet!</span>", \
"<span class='cultitalic'>An arcane tome materializes at your feet.</span>")
/obj/item/weapon/paper/talisman/true_sight
/obj/item/paper/talisman/true_sight
cultist_name = "Talisman of Veiling"
cultist_desc = "A multi-use talisman that hides nearby runes. On its second use, will reveal nearby runes."
color = "#9c9c9c" // grey
@@ -112,7 +112,7 @@
uses = 6
var/revealing = FALSE //if it reveals or not
/obj/item/weapon/paper/talisman/true_sight/invoke(mob/living/user, successfuluse = 1)
/obj/item/paper/talisman/true_sight/invoke(mob/living/user, successfuluse = 1)
. = ..()
if(!revealing)
user.visible_message("<span class='warning'>Thin grey dust falls from [user]'s hand!</span>", \
@@ -128,14 +128,14 @@
R.talismanreveal()
//Rite of Disruption: Weaker than rune
/obj/item/weapon/paper/talisman/emp
/obj/item/paper/talisman/emp
cultist_name = "Talisman of Electromagnetic Pulse"
cultist_desc = "A talisman that will cause a moderately-sized electromagnetic pulse."
color = "#4d94ff" // light blue
invocation = "Ta'gh fara'qha fel d'amar det!"
health_cost = 5
/obj/item/weapon/paper/talisman/emp/invoke(mob/living/user, successfuluse = 1)
/obj/item/paper/talisman/emp/invoke(mob/living/user, successfuluse = 1)
. = ..()
user.visible_message("<span class='warning'>[user]'s hand flashes a bright blue!</span>", \
"<span class='cultitalic'>You speak the words of the talisman, emitting an EMP blast.</span>")
@@ -143,14 +143,14 @@
//Rite of Disorientation: Stuns and inhibit speech on a single target for quite some time
/obj/item/weapon/paper/talisman/stun
/obj/item/paper/talisman/stun
cultist_name = "Talisman of Stunning"
cultist_desc = "A talisman that will stun and inhibit speech on a single target. To use, attack target directly."
color = "#ff0000" // red
invocation = "Fuu ma'jin!"
health_cost = 10
/obj/item/weapon/paper/talisman/stun/invoke(mob/living/user, successfuluse = 0)
/obj/item/paper/talisman/stun/invoke(mob/living/user, successfuluse = 0)
if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff
return ..()
if(iscultist(user))
@@ -159,12 +159,12 @@
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
return 0
/obj/item/weapon/paper/talisman/stun/attack(mob/living/target, mob/living/user, successfuluse = 1)
/obj/item/paper/talisman/stun/attack(mob/living/target, mob/living/user, successfuluse = 1)
if(iscultist(user))
invoke(user, 1)
user.visible_message("<span class='warning'>[user] holds up [src], which explodes in a flash of red light!</span>", \
"<span class='cultitalic'>You stun [target] with the talisman!</span>")
var/obj/item/weapon/nullrod/N = locate() in target
var/obj/item/nullrod/N = locate() in target
if(N)
target.visible_message("<span class='warning'>[target]'s holy weapon absorbs the talisman's light!</span>", \
"<span class='userdanger'>Your holy weapon absorbs the blinding light!</span>")
@@ -189,26 +189,26 @@
//Rite of Arming: Equips cultist armor on the user, where available
/obj/item/weapon/paper/talisman/armor
/obj/item/paper/talisman/armor
cultist_name = "Talisman of Arming"
cultist_desc = "A talisman that will equip the invoker with cultist equipment if there is a slot to equip it to."
color = "#33cc33" // green
invocation = "N'ath reth sh'yro eth draggathnor!"
creation_time = 80
/obj/item/weapon/paper/talisman/armor/invoke(mob/living/user, successfuluse = 1)
/obj/item/paper/talisman/armor/invoke(mob/living/user, successfuluse = 1)
. = ..()
user.visible_message("<span class='warning'>Otherworldly armor suddenly appears on [user]!</span>", \
"<span class='cultitalic'>You speak the words of the talisman, arming yourself!</span>")
user.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head)
user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit)
user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), slot_shoes)
user.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back)
user.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), slot_back)
user.drop_item()
user.put_in_hands(new /obj/item/weapon/melee/cultblade(user))
user.put_in_hands(new /obj/item/weapon/restraints/legcuffs/bola/cult(user))
user.put_in_hands(new /obj/item/melee/cultblade(user))
user.put_in_hands(new /obj/item/restraints/legcuffs/bola/cult(user))
/obj/item/weapon/paper/talisman/armor/attack(mob/living/target, mob/living/user)
/obj/item/paper/talisman/armor/attack(mob/living/target, mob/living/user)
if(iscultist(user) && iscultist(target))
user.drop_item()
invoke(target)
@@ -218,14 +218,14 @@
//Talisman of Horrors: Breaks the mind of the victim with nightmarish hallucinations
/obj/item/weapon/paper/talisman/horror
/obj/item/paper/talisman/horror
cultist_name = "Talisman of Horrors"
cultist_desc = "A talisman that will break the mind of the victim with nightmarish hallucinations."
color = "#ffb366" // light orange
invocation = "Lo'Nab Na'Dm!"
creation_time = 80
/obj/item/weapon/paper/talisman/horror/afterattack(mob/living/target, mob/living/user)
/obj/item/paper/talisman/horror/afterattack(mob/living/target, mob/living/user)
if(iscultist(user) && (get_dist(user, target) < 7))
to_chat(user, "<span class='cultitalic'>You disturb [target] with visions of madness!</span>")
if(iscarbon(target))
@@ -240,7 +240,7 @@
//Talisman of Fabrication: Creates a construct shell out of 25 metal sheets, or converts plasteel into runed metal up to 25 times
/obj/item/weapon/paper/talisman/construction
/obj/item/paper/talisman/construction
cultist_name = "Talisman of Construction"
cultist_desc = "Use this talisman on at least twenty-five metal sheets to create an empty construct shell"
invocation = "Ethra p'ni dedol!"
@@ -248,21 +248,21 @@
uses = 25
creation_time = 80
/obj/item/weapon/paper/talisman/construction/attack_self(mob/living/user)
/obj/item/paper/talisman/construction/attack_self(mob/living/user)
if(iscultist(user))
to_chat(user, "<span class='warning'>To use this talisman, place it upon a stack of metal sheets.</span>")
else
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
/obj/item/weapon/paper/talisman/construction/attack(obj/M,mob/living/user)
/obj/item/paper/talisman/construction/attack(obj/M,mob/living/user)
if(iscultist(user))
to_chat(user, "<span class='cultitalic'>This talisman will only work on a stack of metal or plasteel sheets!</span>")
log_game("Construct talisman failed - not a valid target")
else
..()
/obj/item/weapon/paper/talisman/construction/afterattack(obj/item/stack/sheet/target, mob/user, proximity_flag, click_parameters)
/obj/item/paper/talisman/construction/afterattack(obj/item/stack/sheet/target, mob/user, proximity_flag, click_parameters)
..()
if(proximity_flag && iscultist(user))
var/turf/T = get_turf(target)
@@ -290,14 +290,14 @@
//Talisman of Shackling: Applies special cuffs directly from the talisman
/obj/item/weapon/paper/talisman/shackle
/obj/item/paper/talisman/shackle
cultist_name = "Talisman of Shackling"
cultist_desc = "Use this talisman on a victim to handcuff them with dark bindings."
invocation = "In'totum Lig'abis!"
color = "#B27300" // burnt-orange
uses = 6
/obj/item/weapon/paper/talisman/shackle/invoke(mob/living/user, successfuluse = 0)
/obj/item/paper/talisman/shackle/invoke(mob/living/user, successfuluse = 0)
if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff
return ..()
if(iscultist(user))
@@ -306,7 +306,7 @@
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
return 0
/obj/item/weapon/paper/talisman/shackle/attack(mob/living/carbon/target, mob/living/user)
/obj/item/paper/talisman/shackle/attack(mob/living/carbon/target, mob/living/user)
if(iscultist(user) && istype(target))
if(target.stat == DEAD)
user.visible_message("<span class='cultitalic'>This talisman's magic does not affect the dead!</span>")
@@ -315,7 +315,7 @@
return
..()
/obj/item/weapon/paper/talisman/shackle/proc/CuffAttack(mob/living/carbon/C, mob/living/user)
/obj/item/paper/talisman/shackle/proc/CuffAttack(mob/living/carbon/C, mob/living/user)
if(!C.handcuffed)
invoke(user, 1)
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
@@ -323,7 +323,7 @@
"<span class='userdanger'>[user] begins shaping a dark magic around your wrists!</span>")
if(do_mob(user, C, 30))
if(!C.handcuffed)
C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/cult/used(C)
C.handcuffed = new /obj/item/restraints/handcuffs/energy/cult/used(C)
C.update_handcuffed()
to_chat(user, "<span class='notice'>You shackle [C].</span>")
add_logs(user, C, "handcuffed")
@@ -338,14 +338,14 @@
user.drop_item()
qdel(src)
/obj/item/weapon/restraints/handcuffs/energy/cult //For the talisman of shackling
/obj/item/restraints/handcuffs/energy/cult //For the talisman of shackling
name = "cult shackles"
desc = "Shackles that bind the wrists with sinister magic."
trashtype = /obj/item/weapon/restraints/handcuffs/energy/used
trashtype = /obj/item/restraints/handcuffs/energy/used
origin_tech = "materials=2;magnets=5"
flags_1 = DROPDEL_1
/obj/item/weapon/restraints/handcuffs/energy/cult/used/dropped(mob/user)
/obj/item/restraints/handcuffs/energy/cult/used/dropped(mob/user)
user.visible_message("<span class='danger'>[user]'s shackles shatter in a discharge of dark magic!</span>", \
"<span class='userdanger'>Your [src] shatters in a discharge of dark magic!</span>")
. = ..()
+2 -2
View File
@@ -26,11 +26,11 @@
src.visible_message("<span class='warning'>[src] seems to have been harmed by the purity of [attacker]'s clothes.</span>", "<span class='notice'>Unsullied white clothing is disrupting your form.</span>")
return whiteness[U.type] + 1
if(BANE_TOOLBOX)
if(istype(weapon, /obj/item/weapon/storage/toolbox))
if(istype(weapon, /obj/item/storage/toolbox))
src.visible_message("<span class='warning'>The [weapon] seems unusually robust this time.</span>", "<span class='notice'>The [weapon] is your unmaking!</span>")
return 2.5 // Will take four hits with a normal toolbox to crit.
if(BANE_HARVEST)
if(istype(weapon, /obj/item/weapon/reagent_containers/food/snacks/grown/))
if(istype(weapon, /obj/item/reagent_containers/food/snacks/grown/))
visible_message("<span class='warning'>The spirits of the harvest aid in the exorcism.</span>", "<span class='notice'>The harvest spirits are harming you.</span>")
Knockdown(40)
qdel(weapon)
+2 -2
View File
@@ -444,8 +444,8 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
var/mob/living/carbon/human/H = owner.current
H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/black(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_hands)
H.equip_to_slot_or_del(new /obj/item/weapon/pen(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), slot_hands)
H.equip_to_slot_or_del(new /obj/item/pen(H), slot_l_store)
if(SOULVALUE >= BLOOD_THRESHOLD)
H.set_species(/datum/species/lizard, 1)
H.underwear = "Nude"
+1 -1
View File
@@ -117,7 +117,7 @@ GLOBAL_LIST_INIT(gang_outfit_pool, list(/obj/item/clothing/suit/jacket/leather,
mob.dna.remove_mutation(CLOWNMUT)
var/obj/item/device/gangtool/gangtool = new(mob)
var/obj/item/weapon/pen/gang/T = new(mob)
var/obj/item/pen/gang/T = new(mob)
var/obj/item/toy/crayon/spraycan/gang/SC = new(mob,gang)
var/obj/item/clothing/glasses/hud/security/chameleon/C = new(mob,gang)
+19 -19
View File
@@ -174,16 +174,16 @@
name = "Badass Belt"
id = "belt"
cost = 13
item_path = /obj/item/weapon/storage/belt/military/gang
item_path = /obj/item/storage/belt/military/gang
/obj/item/weapon/storage/belt/military/gang
/obj/item/storage/belt/military/gang
name = "badass belt"
icon_state = "gangbelt"
item_state = "gang"
desc = "The belt buckle simply reads 'BAMF'."
storage_slots = 1
/obj/item/weapon/storage/belt/military/gang/gang_contraband_value()
/obj/item/storage/belt/military/gang/gang_contraband_value()
return 4
///////////////////
@@ -202,19 +202,19 @@
name = "Shuriken"
id = "shuriken"
cost = 3
item_path = /obj/item/weapon/throwing_star
item_path = /obj/item/throwing_star
/datum/gang_item/weapon/switchblade
name = "Switchblade"
id = "switchblade"
cost = 5
item_path = /obj/item/weapon/switchblade
item_path = /obj/item/switchblade
/datum/gang_item/weapon/surplus
name = "Surplus Rifle"
id = "surplus"
cost = 8
item_path = /obj/item/weapon/gun/ballistic/automatic/surplus
item_path = /obj/item/gun/ballistic/automatic/surplus
/datum/gang_item/weapon/ammo/surplus_ammo
name = "Surplus Rifle Ammo"
@@ -226,19 +226,19 @@
name = "Sawn-Off Improvised Shotgun"
id = "sawn"
cost = 6
item_path = /obj/item/weapon/gun/ballistic/revolver/doublebarrel/improvised/sawn
item_path = /obj/item/gun/ballistic/revolver/doublebarrel/improvised/sawn
/datum/gang_item/weapon/ammo/improvised_ammo
name = "Box of Buckshot"
id = "buckshot"
cost = 5
item_path = /obj/item/weapon/storage/box/lethalshot
item_path = /obj/item/storage/box/lethalshot
/datum/gang_item/weapon/pistol
name = "10mm Pistol"
id = "pistol"
cost = 30
item_path = /obj/item/weapon/gun/ballistic/automatic/pistol
item_path = /obj/item/gun/ballistic/automatic/pistol
/datum/gang_item/weapon/ammo/pistol_ammo
name = "10mm Ammo"
@@ -250,7 +250,7 @@
name = "Black Market .50cal Sniper Rifle"
id = "sniper"
cost = 40
item_path = /obj/item/weapon/gun/ballistic/automatic/sniper_rifle/gang
item_path = /obj/item/gun/ballistic/automatic/sniper_rifle/gang
/datum/gang_item/weapon/ammo/sniper_ammo
name = "Smuggled .50cal Sniper Rounds"
@@ -277,7 +277,7 @@
name = "Uzi SMG"
id = "uzi"
cost = 60
item_path = /obj/item/weapon/gun/ballistic/automatic/mini_uzi
item_path = /obj/item/gun/ballistic/automatic/mini_uzi
/datum/gang_item/weapon/ammo/uzi_ammo
@@ -304,38 +304,38 @@
name = "Sharpener"
id = "whetstone"
cost = 3
item_path = /obj/item/weapon/sharpener
item_path = /obj/item/sharpener
/datum/gang_item/equipment/emp
name = "EMP Grenade"
id = "EMP"
cost = 5
item_path = /obj/item/weapon/grenade/empgrenade
item_path = /obj/item/grenade/empgrenade
/datum/gang_item/equipment/c4
name = "C4 Explosive"
id = "c4"
cost = 7
item_path = /obj/item/weapon/grenade/plastic/c4
item_path = /obj/item/grenade/plastic/c4
/datum/gang_item/equipment/frag
name = "Fragmentation Grenade"
id = "frag nade"
cost = 18
item_path = /obj/item/weapon/grenade/syndieminibomb/concussion/frag
item_path = /obj/item/grenade/syndieminibomb/concussion/frag
/datum/gang_item/equipment/stimpack
name = "Black Market Stimulants"
id = "stimpack"
cost = 12
item_path = /obj/item/weapon/reagent_containers/syringe/stimulants
item_path = /obj/item/reagent_containers/syringe/stimulants
/datum/gang_item/equipment/implant_breaker
name = "Implant Breaker"
id = "implant_breaker"
cost = 10
item_path = /obj/item/weapon/implanter/gang
item_path = /obj/item/implanter/gang
spawn_msg = "<span class='notice'>The <b>implant breaker</b> is a single-use device that destroys all implants within the target before trying to recruit them to your gang. Also works on enemy gangsters.</span>"
/datum/gang_item/equipment/implant_breaker/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
@@ -361,7 +361,7 @@
name = "Recruitment Pen"
id = "pen"
cost = 50
item_path = /obj/item/weapon/pen/gang
item_path = /obj/item/pen/gang
spawn_msg = "<span class='notice'>More <b>recruitment pens</b> will allow you to recruit gangsters faster. Only gang leaders can recruit with pens.</span>"
/datum/gang_item/equipment/pen/purchase(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
@@ -431,7 +431,7 @@
/datum/gang_item/equipment/dominator/purchase(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
var/area/usrarea = get_area(user.loc)
var/usrturf = get_turf(user.loc)
if(initial(usrarea.name) == "Space" || isspaceturf(usrturf) || usr.z != ZLEVEL_STATION)
if(initial(usrarea.name) == "Space" || isspaceturf(usrturf) || usr.z != ZLEVEL_STATION || !usrarea.valid_territory)
to_chat(user, "<span class='warning'>You can only use this on the station!</span>")
return FALSE
+4 -4
View File
@@ -1,17 +1,17 @@
/*
* Gang Boss Pens
*/
/obj/item/weapon/pen/gang
/obj/item/pen/gang
origin_tech = "materials=2;syndicate=3"
var/cooldown
var/last_used = 0
var/charges = 1
/obj/item/weapon/pen/gang/New()
/obj/item/pen/gang/New()
..()
last_used = world.time
/obj/item/weapon/pen/gang/attack(mob/living/M, mob/user, stealth = TRUE)
/obj/item/pen/gang/attack(mob/living/M, mob/user, stealth = TRUE)
if(!istype(M))
return
if(ishuman(M) && ishuman(user) && M.stat != DEAD)
@@ -44,7 +44,7 @@
return
..()
/obj/item/weapon/pen/gang/proc/cooldown(datum/gang/gang)
/obj/item/pen/gang/proc/cooldown(datum/gang/gang)
set waitfor = FALSE
var/cooldown_time = 600+(600*gang.bosses.len) // 1recruiter=2mins, 2recruiters=3mins, 3recruiters=4mins
@@ -310,7 +310,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
owner_AI.doomsday_device = DOOM
owner_AI.doomsday_device.start()
for(var/pinpointer in GLOB.pinpointer_list)
var/obj/item/weapon/pinpointer/P = pinpointer
var/obj/item/pinpointer/P = pinpointer
P.switch_mode_to(TRACK_MALF_AI) //Pinpointers start tracking the AI wherever it goes
qdel(src)
@@ -462,8 +462,8 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
/datum/action/innate/ai/destroy_rcds/Activate()
for(var/I in GLOB.rcd_list)
if(!istype(I, /obj/item/weapon/construction/rcd/borg)) //Ensures that cyborg RCDs are spared.
var/obj/item/weapon/construction/rcd/RCD = I
if(!istype(I, /obj/item/construction/rcd/borg)) //Ensures that cyborg RCDs are spared.
var/obj/item/construction/rcd/RCD = I
RCD.detonate_pulse()
to_chat(owner, "<span class='danger'>RCD detonation pulse emitted.</span>")
owner.playsound_local(owner, 'sound/machines/twobeep.ogg', 50, 0)
+11 -11
View File
@@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
var/threat = 0 // used for determining which meteors are most interesting
var/lifetime = DEFAULT_METEOR_LIFETIME
var/list/meteordrop = list(/obj/item/weapon/ore/iron)
var/list/meteordrop = list(/obj/item/ore/iron)
var/dropamt = 2
/obj/effect/meteor/Move()
@@ -170,8 +170,8 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
#undef METEOR_MEDAL
/obj/effect/meteor/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/pickaxe))
/obj/effect/meteor/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/pickaxe))
make_debris()
qdel(src)
else
@@ -209,7 +209,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
hits = 1
hitpwr = 3
meteorsound = 'sound/weapons/gunshot_smg.ogg'
meteordrop = list(/obj/item/weapon/ore/glass)
meteordrop = list(/obj/item/ore/glass)
threat = 1
//Medium-sized
@@ -242,7 +242,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
hits = 5
heavy = 1
meteorsound = 'sound/effects/bamf.ogg'
meteordrop = list(/obj/item/weapon/ore/plasma)
meteordrop = list(/obj/item/ore/plasma)
threat = 20
/obj/effect/meteor/flaming/meteor_effect()
@@ -254,7 +254,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
name = "glowing meteor"
icon_state = "glowing"
heavy = 1
meteordrop = list(/obj/item/weapon/ore/uranium)
meteordrop = list(/obj/item/ore/uranium)
threat = 15
@@ -272,13 +272,13 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
hits = 2
heavy = 1
meteorsound = 'sound/effects/blobattack.ogg'
meteordrop = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human, /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant, /obj/item/organ/heart, /obj/item/organ/lungs, /obj/item/organ/tongue, /obj/item/organ/appendix/)
meteordrop = list(/obj/item/reagent_containers/food/snacks/meat/slab/human, /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant, /obj/item/organ/heart, /obj/item/organ/lungs, /obj/item/organ/tongue, /obj/item/organ/appendix/)
var/meteorgibs = /obj/effect/gibspawner/generic
threat = 2
/obj/effect/meteor/meaty/New()
for(var/path in meteordrop)
if(path == /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant)
if(path == /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant)
meteordrop -= path
meteordrop += pick(subtypesof(path))
@@ -304,7 +304,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
//Meaty Ore Xeno edition
/obj/effect/meteor/meaty/xeno
color = "#5EFF00"
meteordrop = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno, /obj/item/organ/tongue/alien)
meteordrop = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno, /obj/item/organ/tongue/alien)
meteorgibs = /obj/effect/gibspawner/xeno
/obj/effect/meteor/meaty/xeno/New()
@@ -324,7 +324,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
hitpwr = 1
heavy = 1
meteorsound = 'sound/effects/bamf.ogg'
meteordrop = list(/obj/item/weapon/ore/plasma)
meteordrop = list(/obj/item/ore/plasma)
threat = 50
/obj/effect/meteor/tunguska/Move()
@@ -355,7 +355,7 @@ GLOBAL_LIST_INIT(meteorsSPOOKY, list(/obj/effect/meteor/pumpkin))
hits = 10
heavy = 1
dropamt = 1
meteordrop = list(/obj/item/clothing/head/hardhat/pumpkinhead, /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin)
meteordrop = list(/obj/item/clothing/head/hardhat/pumpkinhead, /obj/item/reagent_containers/food/snacks/grown/pumpkin)
threat = 100
/obj/effect/meteor/pumpkin/New()

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