Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into station_traits
This commit is contained in:
@@ -92,7 +92,7 @@
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/ntnet_relay/Initialize()
|
||||
/obj/machinery/ntnet_relay/Initialize(mapload)
|
||||
uid = gl_uid++
|
||||
component_parts = list()
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
var/allow_creating_vr_mobs = TRUE //So you can have vr_sleepers that always spawn you as a specific person or 1 life/chance vr games
|
||||
var/only_current_user_can_interact = FALSE
|
||||
|
||||
/obj/machinery/vr_sleeper/Initialize()
|
||||
/obj/machinery/vr_sleeper/Initialize(mapload)
|
||||
. = ..()
|
||||
sparks = new /datum/effect_system/spark_spread()
|
||||
sparks.set_up(2,0)
|
||||
@@ -151,7 +151,7 @@
|
||||
if(SOFT_CRIT)
|
||||
status = "Barely Conscious"
|
||||
data["vr_avatar"] += list("status" = status, "health" = vr_mob.health, "maxhealth" = vr_mob.maxHealth)
|
||||
else
|
||||
else
|
||||
data["can_delete_avatar"] = FALSE
|
||||
data["vr_avatar"] = FALSE
|
||||
data["isliving"] = FALSE
|
||||
@@ -207,7 +207,7 @@
|
||||
var/vr_category = "default" //So we can have specific sleepers, eg: "Basketball VR Sleeper", etc.
|
||||
var/vr_outfit = /datum/outfit/vr
|
||||
|
||||
/obj/effect/landmark/vr_spawn/Initialize()
|
||||
/obj/effect/landmark/vr_spawn/Initialize(mapload)
|
||||
. = ..()
|
||||
LAZYADD(GLOB.vr_spawnpoints[vr_category], src)
|
||||
|
||||
@@ -235,7 +235,7 @@
|
||||
var/area/vr_area
|
||||
var/list/corpse_party
|
||||
|
||||
/obj/effect/vr_clean_master/Initialize()
|
||||
/obj/effect/vr_clean_master/Initialize(mapload)
|
||||
. = ..()
|
||||
vr_area = get_base_area(src)
|
||||
if(!vr_area)
|
||||
|
||||
@@ -10,7 +10,6 @@ GLOBAL_PROTECT(admin_verbs_default)
|
||||
/client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/
|
||||
/client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify*/
|
||||
/client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/
|
||||
/client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
|
||||
/client/proc/secrets,
|
||||
/client/proc/toggle_hear_radio, /*allows admins to hide all radio output*/
|
||||
/client/proc/reload_admins,
|
||||
@@ -124,6 +123,10 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
|
||||
GLOBAL_PROTECT(admin_verbs_fun)
|
||||
GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/podspawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character))
|
||||
GLOBAL_PROTECT(admin_verbs_spawn)
|
||||
GLOBAL_LIST_INIT(admin_verbs_sensitive, list(
|
||||
/client/proc/investigate_show /*various admintools for investigation. Such as a singulo grief-log*/
|
||||
))
|
||||
GLOBAL_PROTECT(admin_verbs_sensitive)
|
||||
GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer())
|
||||
GLOBAL_PROTECT(admin_verbs_server)
|
||||
/world/proc/AVerbsServer()
|
||||
@@ -316,6 +319,8 @@ GLOBAL_PROTECT(admin_verbs_hideable)
|
||||
add_verb(src, /client/proc/play_web_sound)
|
||||
if(rights & R_SPAWN)
|
||||
add_verb(src, GLOB.admin_verbs_spawn)
|
||||
if(rights & R_SENSITIVE)
|
||||
add_verb(src, GLOB.admin_verbs_sensitive)
|
||||
|
||||
/client/proc/remove_admin_verbs()
|
||||
remove_verb(src, list(
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
anchored = TRUE
|
||||
var/popped = FALSE
|
||||
|
||||
/obj/effect/fun_balloon/Initialize()
|
||||
/obj/effect/fun_balloon/Initialize(mapload)
|
||||
. = ..()
|
||||
SSobj.processing |= src
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
timeleft = 0
|
||||
var/list/warp_points
|
||||
|
||||
/obj/effect/forcefield/arena_shuttle/Initialize()
|
||||
/obj/effect/forcefield/arena_shuttle/Initialize(mapload)
|
||||
. = ..()
|
||||
for(var/obj/effect/landmark/shuttle_arena_safe/exit in GLOB.landmarks_list)
|
||||
warp_points += exit
|
||||
|
||||
@@ -369,6 +369,8 @@
|
||||
qdel(query_find_message_secret)
|
||||
|
||||
/proc/browse_messages(type, target_ckey, index, linkless = FALSE, filter, agegate = FALSE)
|
||||
if((!usr || (target_ckey != usr.ckey)) && !check_rights(R_SENSITIVE))
|
||||
return
|
||||
if(!SSdbcore.Connect())
|
||||
to_chat(usr, "<span class='danger'>Failed to establish database connection.</span>", confidential = TRUE)
|
||||
return
|
||||
|
||||
@@ -1577,7 +1577,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
duration = 9
|
||||
pixel_z = 270
|
||||
|
||||
/obj/effect/temp_visual/fireball/Initialize()
|
||||
/obj/effect/temp_visual/fireball/Initialize(mapload)
|
||||
. = ..()
|
||||
animate(src, pixel_z = 0, time = duration)
|
||||
|
||||
|
||||
@@ -185,8 +185,8 @@ GLOBAL_LIST_EMPTY(antagonists)
|
||||
// RegisterSignal(owner, COMSIG_MINDSHIELD_IMPLANTED, .proc/on_mindshield)
|
||||
if(is_banned(owner.current) && replace_banned)
|
||||
replace_banned_player()
|
||||
// else if(owner.current.client?.holder && (CONFIG_GET(flag/auto_deadmin_antagonists) || owner.current.client.prefs?.toggles & DEADMIN_ANTAGONIST))
|
||||
// owner.current.client.holder.auto_deadmin()
|
||||
else if(owner.current.client?.holder && (CONFIG_GET(flag/auto_deadmin_antagonists) || owner.current.client.prefs?.deadmin & DEADMIN_ANTAGONIST))
|
||||
owner.current.client.holder.auto_deadmin()
|
||||
if(!soft_antag && owner.current.stat != DEAD)
|
||||
owner.current.add_to_current_living_antags()
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
icon_state = "vest_stealth"
|
||||
item_state = "armor"
|
||||
blood_overlay_type = "armor"
|
||||
armor = list("melee" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 15, "bio" = 15, "rad" = 15, "fire" = 70, "acid" = 70)
|
||||
armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 15, BIO = 15, RAD = 15, FIRE = 70, ACID = 70)
|
||||
actions_types = list(/datum/action/item_action/hands_free/activate)
|
||||
allowed = list(
|
||||
/obj/item/abductor,
|
||||
@@ -27,10 +27,10 @@
|
||||
var/stealth_active = 0
|
||||
var/combat_cooldown = 10
|
||||
var/datum/icon_snapshot/disguise
|
||||
var/stealth_armor = list("melee" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 15, "bio" = 15, "rad" = 15, "fire" = 70, "acid" = 70)
|
||||
var/combat_armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 90, "acid" = 90)
|
||||
var/stealth_armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 15, BIO = 15, RAD = 15, FIRE = 70, ACID = 70)
|
||||
var/combat_armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 50, RAD = 50, FIRE = 90, ACID = 90)
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/Initialize()
|
||||
/obj/item/clothing/suit/armor/abductor/vest/Initialize(mapload)
|
||||
. = ..()
|
||||
stealth_armor = getArmor(arglist(stealth_armor))
|
||||
combat_armor = getArmor(arglist(combat_armor))
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
var/mind_control_duration = 1800
|
||||
var/active_mind_control = FALSE
|
||||
|
||||
/obj/item/organ/heart/gland/Initialize()
|
||||
/obj/item/organ/heart/gland/Initialize(mapload)
|
||||
. = ..()
|
||||
icon_state = pick(list("health", "spider", "slime", "emp", "species", "egg", "vent", "mindshock", "viral"))
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
mind_control_duration = 1200
|
||||
var/list/possible_reagents = list()
|
||||
|
||||
/obj/item/organ/heart/gland/chem/Initialize()
|
||||
/obj/item/organ/heart/gland/chem/Initialize(mapload)
|
||||
. = ..()
|
||||
for(var/R in subtypesof(/datum/reagent/drug) + subtypesof(/datum/reagent/medicine) + typesof(/datum/reagent/toxin))
|
||||
possible_reagents += R
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
//TODO : replace with presets or spectrum
|
||||
return rgb(rand(0,255),rand(0,255),rand(0,255))
|
||||
|
||||
/obj/machinery/abductor/gland_dispenser/Initialize()
|
||||
/obj/machinery/abductor/gland_dispenser/Initialize(mapload)
|
||||
. = ..()
|
||||
gland_types = subtypesof(/obj/item/organ/heart/gland)
|
||||
gland_types = shuffle(gland_types)
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
icon_state = "teleport"
|
||||
duration = 80
|
||||
|
||||
/obj/effect/temp_visual/teleport_abductor/Initialize()
|
||||
/obj/effect/temp_visual/teleport_abductor/Initialize(mapload)
|
||||
. = ..()
|
||||
var/datum/effect_system/spark_spread/S = new
|
||||
S.set_up(10,0,loc)
|
||||
|
||||
@@ -46,10 +46,10 @@
|
||||
else
|
||||
adjustFireLoss(5)
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/CanPass(atom/movable/mover, turf/target)
|
||||
/mob/living/simple_animal/hostile/blob/CanAllowThrough(atom/movable/mover, turf/target)
|
||||
. = ..()
|
||||
if(istype(mover, /obj/structure/blob))
|
||||
return 1
|
||||
return ..()
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/Process_Spacemove(movement_dir = 0)
|
||||
for(var/obj/structure/blob/B in range(1, src))
|
||||
@@ -221,7 +221,7 @@
|
||||
hud_type = /datum/hud/blobbernaut
|
||||
var/independent = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/blobbernaut/Initialize()
|
||||
/mob/living/simple_animal/hostile/blob/blobbernaut/Initialize(mapload)
|
||||
. = ..()
|
||||
if(independent)
|
||||
pass_flags &= ~PASSBLOB
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "blank_blob"
|
||||
desc = "A huge, pulsating yellow mass."
|
||||
max_integrity = 400
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 5, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 90) // Last stand
|
||||
armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 5, BOMB = 70, BIO = 0, RAD = 0, FIRE = 75, ACID = 90) // Last stand
|
||||
explosion_block = 6
|
||||
point_return = -1
|
||||
health_regen = 0 //we regen in Life() instead of when pulsed
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
/obj/structure/blob/core/ex_act(severity, target, origin)
|
||||
var/damage = 50 - 10 * severity //remember, the core takes half brute damage, so this is 20/15/10 damage based on severity
|
||||
take_damage(damage, BRUTE, "bomb", 0)
|
||||
take_damage(damage, BRUTE, BOMB, 0)
|
||||
|
||||
/obj/structure/blob/core/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir, overmind_reagent_trigger = 1)
|
||||
. = ..()
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
max_integrity = 200
|
||||
health_regen = 1
|
||||
point_return = 25
|
||||
armor = list("melee" = 10, "bullet" = 20, "laser" = 15, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
armor = list(MELEE = 10, BULLET = 20, LASER = 15, ENERGY = 10, BOMB = 40, BIO = 0, RAD = 0, FIRE = 90, ACID = 90)
|
||||
var/list/spores = list()
|
||||
var/mob/living/simple_animal/hostile/blob/blobbernaut/naut = null
|
||||
var/max_spores = 3
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
icon_state = "blank_blob"
|
||||
desc = "A large, pulsating yellow mass."
|
||||
max_integrity = 200
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 65, "acid" = 90)
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 65, ACID = 90)
|
||||
health_regen = 3
|
||||
point_return = 25
|
||||
|
||||
|
||||
/obj/structure/blob/node/Initialize()
|
||||
/obj/structure/blob/node/Initialize(mapload)
|
||||
GLOB.blob_nodes += src
|
||||
START_PROCESSING(SSobj, src)
|
||||
. = ..()
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
desc = "A thin spire of slightly swaying tendrils."
|
||||
max_integrity = 60
|
||||
point_return = 15
|
||||
armor = list("melee" = 10, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
armor = list(MELEE = 10, BULLET = 10, LASER = 0, ENERGY = 0, BOMB = 15, BIO = 0, RAD = 0, FIRE = 90, ACID = 90)
|
||||
var/resource_delay = 0
|
||||
|
||||
/obj/structure/blob/resource/scannerreport()
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
explosion_block = 3
|
||||
point_return = 4
|
||||
atmosblock = TRUE
|
||||
armor = list("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
armor = list(MELEE = 25, BULLET = 25, LASER = 15, ENERGY = 10, BOMB = 20, BIO = 0, RAD = 0, FIRE = 90, ACID = 90)
|
||||
var/weakened
|
||||
|
||||
/obj/structure/blob/shield/scannerreport()
|
||||
@@ -28,7 +28,7 @@
|
||||
desc = "[damaged_desc]"
|
||||
atmosblock = FALSE
|
||||
if(!weakened)
|
||||
armor = armor.setRating("melee" = 15, "bullet" = 15, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
armor = armor.setRating(MELEE = 15, BULLET = 15, LASER = 5, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 90, ACID = 90)
|
||||
weakened = TRUE
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
@@ -36,7 +36,7 @@
|
||||
desc = initial(desc)
|
||||
atmosblock = TRUE
|
||||
if(weakened)
|
||||
armor = armor.setRating("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
armor = armor.setRating(MELEE = 25, BULLET = 25, LASER = 15, ENERGY = 10, BOMB = 20, BIO = 0, RAD = 0, FIRE = 90, ACID = 90)
|
||||
weakened = FALSE
|
||||
air_update_turf(1)
|
||||
|
||||
|
||||
@@ -14,15 +14,15 @@
|
||||
reagent = /datum/reagent/blob/blazing_oil
|
||||
|
||||
/datum/blobstrain/reagent/blazing_oil/extinguish_reaction(obj/structure/blob/B)
|
||||
B.take_damage(1.5, BURN, "energy")
|
||||
B.take_damage(1.5, BURN, ENERGY)
|
||||
|
||||
/datum/blobstrain/reagent/blazing_oil/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if(damage_type == BURN && damage_flag != "energy")
|
||||
if(damage_type == BURN && damage_flag != ENERGY)
|
||||
for(var/turf/open/T in range(1, B))
|
||||
var/obj/structure/blob/C = locate() in T
|
||||
if(!(C && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) && prob(80))
|
||||
new /obj/effect/hotspot(T)
|
||||
if(damage_flag == "fire")
|
||||
if(damage_flag == FIRE)
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
return damage * 1.25 //a laser will do 25 damage, which will kill any normal blob
|
||||
|
||||
/datum/blobstrain/reagent/electromagnetic_web/death_reaction(obj/structure/blob/B, damage_flag)
|
||||
if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser")
|
||||
if(damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER)
|
||||
empulse_using_range(B.loc, 5) //less than screen range, so you can stand out of range to avoid it
|
||||
|
||||
/datum/reagent/blob/electromagnetic_web
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
reagent = /datum/reagent/blob/energized_jelly
|
||||
|
||||
/datum/blobstrain/reagent/energized_jelly/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && B.obj_integrity - damage <= 0 && prob(10))
|
||||
if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && B.obj_integrity - damage <= 0 && prob(10))
|
||||
do_sparks(rand(2, 4), FALSE, B)
|
||||
return ..()
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
/datum/blobstrain/reagent/energized_jelly/emp_reaction(obj/structure/blob/B, severity)
|
||||
var/damage = rand(30, 50) - severity * rand(10, 15)
|
||||
B.take_damage(damage, BURN, "energy")
|
||||
B.take_damage(damage, BURN, ENERGY)
|
||||
|
||||
/datum/reagent/blob/energized_jelly
|
||||
name = "Energized Jelly"
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
reagent = /datum/reagent/blob/explosive_lattice
|
||||
|
||||
/datum/blobstrain/reagent/explosive_lattice/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if(damage_flag == "bomb")
|
||||
if(damage_flag == BOMB)
|
||||
return 0
|
||||
else if(damage_flag != "melee" && damage_flag != "bullet" && damage_flag != "laser")
|
||||
else if(damage_flag != MELEE && damage_flag != BULLET && damage_flag != LASER)
|
||||
return damage * 1.5
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -13,12 +13,12 @@
|
||||
reagent = /datum/reagent/blob/pressurized_slime
|
||||
|
||||
/datum/blobstrain/reagent/pressurized_slime/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") || damage_type != BURN)
|
||||
if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) || damage_type != BURN)
|
||||
extinguisharea(B, damage)
|
||||
return ..()
|
||||
|
||||
/datum/blobstrain/reagent/pressurized_slime/death_reaction(obj/structure/blob/B, damage_flag)
|
||||
if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser")
|
||||
if(damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER)
|
||||
B.visible_message("<span class='boldwarning'>The blob ruptures, spraying the area with liquid!</span>")
|
||||
extinguisharea(B, 50)
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
/datum/blobstrain/reagent/reactive_spines/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if(damage && damage_type == BRUTE && B.obj_integrity - damage > 0) //is there any damage, is it brute, and will we be alive
|
||||
if(damage_flag == "melee")
|
||||
if(damage_flag == MELEE)
|
||||
B.visible_message("<span class='boldwarning'>The blob retaliates, lashing out!</span>")
|
||||
for(var/atom/A in range(1, B))
|
||||
A.blob_act(B)
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
B.forceMove(T)
|
||||
|
||||
/datum/blobstrain/reagent/shifting_fragments/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && damage > 0 && B.obj_integrity - damage > 0 && prob(60-damage))
|
||||
if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && damage > 0 && B.obj_integrity - damage > 0 && prob(60-damage))
|
||||
var/list/blobstopick = list()
|
||||
for(var/obj/structure/blob/OB in orange(1, B))
|
||||
if((istype(OB, /obj/structure/blob/normal) || (istype(OB, /obj/structure/blob/shield) && prob(25))) && OB.overmind && OB.overmind.blobstrain.type == B.overmind.blobstrain.type)
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
message = "The blobs strike you"
|
||||
|
||||
/datum/blobstrain/reagent/synchronous_mesh/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") //the cause isn't fire or bombs, so split the damage
|
||||
if(damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) //the cause isn't fire or bombs, so split the damage
|
||||
var/damagesplit = 1 //maximum split is 9, reducing the damage each blob takes to 11% but doing that damage to 9 blobs
|
||||
for(var/obj/structure/blob/C in orange(1, B))
|
||||
if(!istype(C, /obj/structure/blob/core) && !istype(C, /obj/structure/blob/node) && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) //if it doesn't have the same chemical or is a core or node, don't split damage to it
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
reagent = /datum/reagent/blob/zombifying_pods
|
||||
|
||||
/datum/blobstrain/reagent/zombifying_pods/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && damage <= 20 && B.obj_integrity - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore.
|
||||
if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && damage <= 20 && B.obj_integrity - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore.
|
||||
B.visible_message("<span class='warning'><b>A spore floats free of the blob!</b></span>")
|
||||
var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(B.loc)
|
||||
BS.overmind = B.overmind
|
||||
|
||||
@@ -4,14 +4,15 @@
|
||||
icon = 'icons/mob/blob.dmi'
|
||||
light_range = 2
|
||||
desc = "A thick wall of writhing tendrils."
|
||||
density = FALSE //this being false causes two bugs, being able to attack blob tiles behind other blobs and being unable to move on blob tiles in no gravity, but turning it to 1 causes the blob mobs to be unable to path through blobs, which is probably worse.
|
||||
density = TRUE
|
||||
opacity = 0
|
||||
anchored = TRUE
|
||||
layer = BELOW_MOB_LAYER
|
||||
pass_flags_self = PASSBLOB
|
||||
CanAtmosPass = ATMOS_PASS_PROC
|
||||
var/point_return = 0 //How many points the blob gets back when it removes a blob of that type. If less than 0, blob cannot be removed.
|
||||
max_integrity = 30
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70)
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 70)
|
||||
var/health_regen = 2 //how much health this blob regens when pulsed
|
||||
var/pulse_timestamp = 0 //we got pulsed when?
|
||||
var/heal_timestamp = 0 //we got healed when?
|
||||
@@ -67,11 +68,6 @@
|
||||
/obj/structure/blob/BlockThermalConductivity()
|
||||
return atmosblock
|
||||
|
||||
/obj/structure/blob/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover) && (mover.pass_flags & PASSBLOB))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/structure/blob/CanAtmosPass(turf/T)
|
||||
return !atmosblock
|
||||
|
||||
@@ -210,9 +206,9 @@
|
||||
. = ..()
|
||||
if(overmind)
|
||||
if(overmind.blobstrain.tesla_reaction(src, power))
|
||||
take_damage(power/400, BURN, "energy")
|
||||
take_damage(power/400, BURN, ENERGY)
|
||||
else
|
||||
take_damage(power/400, BURN, "energy")
|
||||
take_damage(power/400, BURN, ENERGY)
|
||||
|
||||
/obj/structure/blob/extinguish()
|
||||
..()
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
var/nighttime_duration = 900 //15 Minutes
|
||||
var/issued_XP = FALSE
|
||||
|
||||
/obj/effect/sunlight/Initialize()
|
||||
/obj/effect/sunlight/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
/obj/effect/sunlight/proc/start_countdown()
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
resistance_flags = NONE
|
||||
max_integrity = 100
|
||||
integrity_failure = 0.5
|
||||
armor = list("melee" = 50, "bullet" = 20, "laser" = 30, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 60)
|
||||
armor = list(MELEE = 50, BULLET = 20, LASER = 30, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 70, ACID = 60)
|
||||
|
||||
/obj/structure/closet/crate/coffin/meatcoffin
|
||||
name = "meat coffin"
|
||||
@@ -69,7 +69,7 @@
|
||||
material_drop = /obj/item/reagent_containers/food/snacks/meat/slab
|
||||
material_drop_amount = 3
|
||||
integrity_failure = 0.57
|
||||
armor = list("melee" = 70, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100)
|
||||
armor = list(MELEE = 70, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 70, BIO = 0, RAD = 0, FIRE = 70, ACID = 100)
|
||||
|
||||
/obj/structure/closet/crate/coffin/metalcoffin
|
||||
name = "metal coffin"
|
||||
@@ -85,7 +85,7 @@
|
||||
material_drop_amount = 5
|
||||
max_integrity = 200
|
||||
integrity_failure = 0.25
|
||||
armor = list("melee" = 40, "bullet" = 15, "laser" = 50, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 60)
|
||||
armor = list(MELEE = 40, BULLET = 15, LASER = 50, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 70, ACID = 60)
|
||||
|
||||
//////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -302,7 +302,7 @@
|
||||
firing_effect_type = null
|
||||
var/obj/item/gun/magic/tentacle/gun //the item that shot it
|
||||
|
||||
/obj/item/ammo_casing/magic/tentacle/Initialize()
|
||||
/obj/item/ammo_casing/magic/tentacle/Initialize(mapload)
|
||||
gun = loc
|
||||
. = ..()
|
||||
|
||||
@@ -321,7 +321,7 @@
|
||||
var/chain
|
||||
var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it
|
||||
|
||||
/obj/item/projectile/tentacle/Initialize()
|
||||
/obj/item/projectile/tentacle/Initialize(mapload)
|
||||
source = loc
|
||||
. = ..()
|
||||
|
||||
@@ -503,10 +503,10 @@
|
||||
item_flags = DROPDEL
|
||||
clothing_flags = STOPSPRESSUREDAMAGE //Not THICKMATERIAL 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/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.
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 90) //No armor at all.
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/suit/space/changeling/Initialize()
|
||||
/obj/item/clothing/suit/space/changeling/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
if(ismob(loc))
|
||||
@@ -524,10 +524,10 @@
|
||||
desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front."
|
||||
item_flags = DROPDEL
|
||||
clothing_flags = STOPSPRESSUREDAMAGE
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 90)
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
|
||||
/obj/item/clothing/head/helmet/space/changeling/Initialize()
|
||||
/obj/item/clothing/head/helmet/space/changeling/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
@@ -558,12 +558,12 @@
|
||||
icon_state = "lingarmor"
|
||||
item_flags = DROPDEL
|
||||
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
armor = list("melee" = 70, "bullet" = 60, "laser" = 30, "energy" = 40, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 50, "acid" = 90)
|
||||
armor = list(MELEE = 70, BULLET = 60, LASER = 30, ENERGY = 40, BOMB = 10, BIO = 4, RAD = 0, FIRE = 50, ACID = 90)
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
cold_protection = 0
|
||||
heat_protection = 0
|
||||
|
||||
/obj/item/clothing/suit/armor/changeling/Initialize()
|
||||
/obj/item/clothing/suit/armor/changeling/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
if(ismob(loc))
|
||||
@@ -574,10 +574,10 @@
|
||||
desc = "A tough, hard covering of black chitin with transparent chitin in front."
|
||||
icon_state = "lingarmorhelmet"
|
||||
item_flags = DROPDEL
|
||||
armor = list("melee" = 70, "bullet" = 60, "laser" = 30, "energy" = 40, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 50, "acid" = 90)
|
||||
armor = list(MELEE = 70, BULLET = 60, LASER = 30, ENERGY = 40, BOMB = 10, BIO = 4, RAD = 0, FIRE = 50, ACID = 90)
|
||||
flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE
|
||||
|
||||
/obj/item/clothing/head/helmet/changeling/Initialize()
|
||||
/obj/item/clothing/head/helmet/changeling/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
@@ -653,9 +653,9 @@
|
||||
cold_protection = HANDS
|
||||
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
|
||||
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
|
||||
armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 35, "bio" = 35, "rad" = 35, "fire" = 0, "acid" = 0)
|
||||
armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 35, BIO = 35, RAD = 35, FIRE = 0, ACID = 0)
|
||||
|
||||
/obj/item/clothing/gloves/claws/Initialize()
|
||||
/obj/item/clothing/gloves/claws/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
@@ -697,7 +697,7 @@
|
||||
cold_protection = ARMS|HANDS
|
||||
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
|
||||
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
|
||||
armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 35, "bio" = 35, "rad" = 35, "fire" = 0, "acid" = 0)
|
||||
armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 35, BIO = 35, RAD = 35, FIRE = 0, ACID = 0)
|
||||
enhancement = 6 // first, do harm. all of it. all of the harm. just fuck em up.
|
||||
wound_enhancement = 6
|
||||
var/fast_enhancement = 6
|
||||
@@ -727,7 +727,7 @@
|
||||
to_chat(user, "<span class='notice'>[src] are now formed to allow for [fasthands ? "fast, precise strikes" : "crippling, damaging blows"].</span>")
|
||||
addtimer(CALLBACK(src, .proc/use_buffs, user, TRUE), 0.1) // go fuckin get em
|
||||
|
||||
/obj/item/clothing/gloves/fingerless/pugilist/cling/Initialize()
|
||||
/obj/item/clothing/gloves/fingerless/pugilist/cling/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
/obj/item/clothing/glasses/changeling
|
||||
name = "flesh"
|
||||
|
||||
/obj/item/clothing/glasses/changeling/Initialize()
|
||||
/obj/item/clothing/glasses/changeling/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
/obj/item/clothing/under/changeling
|
||||
name = "flesh"
|
||||
|
||||
/obj/item/clothing/under/changeling/Initialize()
|
||||
/obj/item/clothing/under/changeling/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
name = "flesh"
|
||||
allowed = list(/obj/item/changeling)
|
||||
|
||||
/obj/item/clothing/suit/changeling/Initialize()
|
||||
/obj/item/clothing/suit/changeling/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
/obj/item/clothing/head/changeling
|
||||
name = "flesh"
|
||||
|
||||
/obj/item/clothing/head/changeling/Initialize()
|
||||
/obj/item/clothing/head/changeling/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
/obj/item/clothing/shoes/changeling
|
||||
name = "flesh"
|
||||
|
||||
/obj/item/clothing/shoes/changeling/Initialize()
|
||||
/obj/item/clothing/shoes/changeling/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
/obj/item/clothing/gloves/changeling
|
||||
name = "flesh"
|
||||
|
||||
/obj/item/clothing/gloves/changeling/Initialize()
|
||||
/obj/item/clothing/gloves/changeling/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
/obj/item/clothing/mask/changeling
|
||||
name = "flesh"
|
||||
|
||||
/obj/item/clothing/mask/changeling/Initialize()
|
||||
/obj/item/clothing/mask/changeling/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
slot_flags = ALL
|
||||
allowed = list(/obj/item/changeling)
|
||||
|
||||
/obj/item/changeling/Initialize()
|
||||
/obj/item/changeling/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
opacity = 0
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF
|
||||
|
||||
/obj/effect/clockwork/Initialize()
|
||||
/obj/effect/clockwork/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.all_clockwork_objects += src
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
/obj/effect/clockwork/city_of_cogs_rift/singularity_pull()
|
||||
return
|
||||
|
||||
/obj/effect/clockwork/city_of_cogs_rift/Initialize()
|
||||
/obj/effect/clockwork/city_of_cogs_rift/Initialize(mapload)
|
||||
. = ..()
|
||||
visible_message("<span class='warning'>The air above [loc] shimmers and pops as a [name] forms there!</span>")
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
smooth = SMOOTH_TRUE
|
||||
layer = CLOSED_TURF_LAYER
|
||||
|
||||
/obj/effect/clockwork/overlay/wall/Initialize()
|
||||
/obj/effect/clockwork/overlay/wall/Initialize(mapload)
|
||||
. = ..()
|
||||
queue_smooth_neighbors(src)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/queue_smooth, src), 1)
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
sigil_name = "Sigil of Transmission"
|
||||
affects_servants = TRUE
|
||||
|
||||
/obj/effect/clockwork/sigil/transmission/Initialize()
|
||||
/obj/effect/clockwork/sigil/transmission/Initialize(mapload)
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
@@ -229,7 +229,7 @@
|
||||
else if(get_clockwork_power())
|
||||
to_chat(L, "<span class='brass'>You feel a slight, static shock.</span>")
|
||||
|
||||
/obj/effect/clockwork/sigil/transmission/Initialize()
|
||||
/obj/effect/clockwork/sigil/transmission/Initialize(mapload)
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
density = TRUE
|
||||
CanAtmosPass = ATMOS_PASS_NO
|
||||
|
||||
/obj/effect/clockwork/servant_blocker/Initialize()
|
||||
/obj/effect/clockwork/servant_blocker/Initialize(mapload)
|
||||
. = ..()
|
||||
air_update_turf(TRUE)
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
var/is_stable = FALSE
|
||||
var/busy = FALSE //If someone is already working on closing the gateway, only needed for stable gateways but in the parent to not need typecasting
|
||||
|
||||
/obj/effect/clockwork/spatial_gateway/Initialize()
|
||||
/obj/effect/clockwork/spatial_gateway/Initialize(mapload)
|
||||
. = ..()
|
||||
addtimer(CALLBACK(src, .proc/check_setup), 1)
|
||||
|
||||
|
||||
@@ -72,8 +72,11 @@ drain_amount: How much is drained by default; Influenced by a multiplier on most
|
||||
cell.use(.)
|
||||
spark_system.start()
|
||||
|
||||
/obj/mecha/power_drain(clockcult_user, drain_weapons = FALSE, recursive = FALSE, drain_amount = MIN_CLOCKCULT_POWER)
|
||||
if(!clockcult_user || (occupant && !is_servant_of_ratvar(occupant)))
|
||||
/obj/vehicle/sealed/mecha/power_drain(clockcult_user, drain_weapons = FALSE, recursive = FALSE, drain_amount = MIN_CLOCKCULT_POWER)
|
||||
if(!clockcult_user || LAZYLEN(occupants))
|
||||
for(var/mob/living/MB in occupants)
|
||||
if(is_servant_of_ratvar(MB))
|
||||
return
|
||||
if(recursive)
|
||||
var/succ = 0
|
||||
for(var/atom/movable/target in contents) //Hiding in your mech won't save you.
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
icon_state = "rare_pepe"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/clockwork/Initialize()
|
||||
/obj/item/clockwork/Initialize(mapload)
|
||||
. = ..()
|
||||
ratvar_act()
|
||||
GLOB.all_clockwork_objects += src
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
var/randomspritemax = 2
|
||||
var/sprite_shift = 9
|
||||
|
||||
/obj/item/clockwork/alloy_shards/Initialize()
|
||||
/obj/item/clockwork/alloy_shards/Initialize(mapload)
|
||||
. = ..()
|
||||
if(randomsinglesprite)
|
||||
replace_name_desc()
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
var/damage_per_combo = 2
|
||||
var/maximum_combo_damage = 18 //33 damage on max stacks. Usually the target will already be dead by then but if they somehow aren't, better to have this capped
|
||||
|
||||
/obj/item/clockwork/brass_claw/Initialize()
|
||||
/obj/item/clockwork/brass_claw/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/butchering, 60, 80)
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
item_state = "ratvarian_shield"
|
||||
desc = "A resilient shield made out of brass.. It feels warm to the touch."
|
||||
var/clockwork_desc = "A powerful shield of ratvarian making. It absorbs blocked attacks to charge devastating bashes."
|
||||
armor = list("melee" = 80, "bullet" = 70, "laser" = -10, "energy" = -20, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
|
||||
armor = list(MELEE = 80, BULLET = 70, LASER = -10, ENERGY = -20, BOMB = 60, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
|
||||
shield_flags = SHIELD_FLAGS_DEFAULT | SHIELD_KINETIC_STRONG | SHIELD_ENERGY_WEAK
|
||||
max_integrity = 300 //High integrity, extremely strong against melee / bullets, but still quite easy to destroy with lasers and energy
|
||||
repair_material = /obj/item/stack/tile/brass
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
flags_inv = HIDEEARS|HIDEHAIR|HIDEFACE|HIDESNOUT
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
armor = list("melee" = 50, "bullet" = 70, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "magic" = 60, "wound" = 65)
|
||||
armor = list(MELEE = 50, BULLET = 70, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, MAGIC = 60, WOUND = 65)
|
||||
|
||||
/obj/item/clothing/head/helmet/clockwork/Initialize()
|
||||
/obj/item/clothing/head/helmet/clockwork/Initialize(mapload)
|
||||
. = ..()
|
||||
ratvar_act()
|
||||
GLOB.all_clockwork_objects += src
|
||||
@@ -68,11 +68,11 @@
|
||||
cold_protection = CHEST|GROIN|LEGS
|
||||
heat_protection = CHEST|GROIN|LEGS
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
armor = list("melee" = 60, "bullet" = 70, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "magic" = 60, "wound" = 65)
|
||||
armor = list(MELEE = 60, BULLET = 70, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, MAGIC = 60, WOUND = 65)
|
||||
allowed = list(/obj/item/clockwork, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor, /obj/item/mmi/posibrain/soul_vessel, /obj/item/reagent_containers/food/drinks/bottle/holyoil)
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC
|
||||
|
||||
/obj/item/clothing/suit/armor/clockwork/Initialize()
|
||||
/obj/item/clothing/suit/armor/clockwork/Initialize(mapload)
|
||||
. = ..()
|
||||
ratvar_act()
|
||||
GLOB.all_clockwork_objects += src
|
||||
@@ -135,9 +135,9 @@
|
||||
siemens_coefficient = 0
|
||||
permeability_coefficient = 0.05
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
armor = list("melee" = 80, "bullet" = 70, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100, "magic" = 70, "wound" = 85)
|
||||
armor = list(MELEE = 80, BULLET = 70, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, MAGIC = 70, WOUND = 85)
|
||||
|
||||
/obj/item/clothing/gloves/clockwork/Initialize()
|
||||
/obj/item/clothing/gloves/clockwork/Initialize(mapload)
|
||||
. = ..()
|
||||
ratvar_act()
|
||||
GLOB.all_clockwork_objects += src
|
||||
@@ -190,7 +190,7 @@
|
||||
equip_delay_other = 30
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/item/clothing/shoes/clockwork/Initialize()
|
||||
/obj/item/clothing/shoes/clockwork/Initialize(mapload)
|
||||
. = ..()
|
||||
ratvar_act()
|
||||
GLOB.all_clockwork_objects += src
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
if(!GLOB.ratvar_awakens)
|
||||
SStgui.close_uis(src)
|
||||
|
||||
/obj/item/clockwork/slab/Initialize()
|
||||
/obj/item/clockwork/slab/Initialize(mapload)
|
||||
. = ..()
|
||||
update_slab_info(src)
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
var/creation_message = "<span class='brass'>The chassis shudders and hums to life!</span>"
|
||||
var/construct_type //The construct this shell will create
|
||||
|
||||
/obj/item/clockwork/construct_chassis/Initialize()
|
||||
/obj/item/clockwork/construct_chassis/Initialize(mapload)
|
||||
. = ..()
|
||||
var/area/A = get_area(src)
|
||||
if(A && construct_type)
|
||||
@@ -92,7 +92,7 @@
|
||||
var/infinite_resources = FALSE //No.
|
||||
var/static/obj/item/seasonal_hat //Share it with all other scarabs, since we're from the same cult!
|
||||
|
||||
/obj/item/clockwork/construct_chassis/cogscarab/Initialize()
|
||||
/obj/item/clockwork/construct_chassis/cogscarab/Initialize(mapload)
|
||||
. = ..()
|
||||
if(GLOB.servants_active)
|
||||
infinite_resources = FALSE //This check is relatively irrelevant until *someone* makes the infinite resources var default to true again, so, leaving it in.
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
item_flags = NOBLUDGEON
|
||||
var/obj/machinery/power/apc/apc
|
||||
|
||||
/obj/item/clockwork/integration_cog/Initialize()
|
||||
/obj/item/clockwork/integration_cog/Initialize(mapload)
|
||||
. = ..()
|
||||
transform *= 0.5 //little cog!
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
var/recharge_cooldown = 300 //divided by 10 if ratvar is alive
|
||||
actions_types = list(/datum/action/item_action/clock/toggle_visor)
|
||||
|
||||
/obj/item/clothing/glasses/judicial_visor/Initialize()
|
||||
/obj/item/clothing/glasses/judicial_visor/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.all_clockwork_objects += src
|
||||
blaster = new(src)
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
force_replace_ai_name = TRUE
|
||||
overrides_aicore_laws = TRUE
|
||||
|
||||
/obj/item/mmi/posibrain/soul_vessel/Initialize()
|
||||
/obj/item/mmi/posibrain/soul_vessel/Initialize(mapload)
|
||||
. = ..()
|
||||
radio.on = FALSE
|
||||
laws = new /datum/ai_laws/ratvar()
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
visor_vars_to_toggle = NONE //we don't actually toggle anything we just set it
|
||||
tint = 3 //this'll get reset, but it won't handle vision updates properly otherwise
|
||||
|
||||
/obj/item/clothing/glasses/wraith_spectacles/Initialize()
|
||||
/obj/item/clothing/glasses/wraith_spectacles/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.all_clockwork_objects += src
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
var/playstyle_string = "<span class='heavy_brass'>You are a bug, yell at whoever spawned you!</span>"
|
||||
var/empower_string = "<span class='heavy_brass'>You have nothing to empower, yell at the coders!</span>" //Shown to the mob when the herald beacon activates
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/Initialize()
|
||||
/mob/living/simple_animal/hostile/clockwork/Initialize(mapload)
|
||||
. = ..()
|
||||
update_values()
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
Stay near your host to protect and heal them; being too far from your host will rapidly cause you massive damage. Recall to your host if you are too weak and believe you cannot continue \
|
||||
fighting safely. As a final note, you should probably avoid harming any fellow servants of Ratvar.</span>"
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/guardian/Initialize()
|
||||
/mob/living/simple_animal/hostile/clockwork/guardian/Initialize(mapload)
|
||||
. = ..()
|
||||
true_name = pick(possible_true_names)
|
||||
|
||||
|
||||
@@ -310,7 +310,7 @@ Judgement 80k power or nine converts
|
||||
var/datum/progressbar/progbar
|
||||
|
||||
/datum/clockwork_scripture/ranged_ability/Destroy()
|
||||
qdel(progbar)
|
||||
progbar.end_progress()
|
||||
return ..()
|
||||
|
||||
/datum/clockwork_scripture/ranged_ability/scripture_effects()
|
||||
@@ -333,7 +333,7 @@ Judgement 80k power or nine converts
|
||||
(allow_mobility || (can_recite() && T == get_turf(invoker))))
|
||||
if(progbar)
|
||||
if(slab.slab_ability.in_progress)
|
||||
qdel(progbar)
|
||||
progbar.end_progress()
|
||||
else
|
||||
progbar.update(end_time - world.time)
|
||||
stoplag(1)
|
||||
|
||||
@@ -207,20 +207,20 @@
|
||||
/datum/clockwork_scripture/create_object/summon_arbiter
|
||||
descname = "Powerful Assault Mech"
|
||||
name = "Summon Neovgre, the Anima Bulwark"
|
||||
desc = "Calls forth the mighty Anima Bulwark, a mech with superior defensive and offensive capabilities. It will \
|
||||
desc = "Calls forth the mighty Anima Bulwark, a two-person mech with superior defensive and offensive capabilities. It will \
|
||||
steadily regenerate HP and triple its regeneration speed while standing \
|
||||
on a clockwork tile. It will automatically draw power from nearby sigils of \
|
||||
transmission should the need arise. Its Arbiter laser cannon can decimate foes \
|
||||
from a range and is capable of smashing through any barrier presented to it. \
|
||||
Be warned however, choosing to pilot Neovgre is a lifetime commitment, once you are \
|
||||
in you cannot leave and when it is destroyed it will explode catastrophically, with you inside."
|
||||
Be warned however, choosing to pilot or man Neovgre is a lifetime commitment, once you are \
|
||||
in you cannot leave and when it is destroyed it will explode catastrophically, with everyone inside."
|
||||
invocations = list("By the strength of the alloy...!!", "...call forth the Arbiter!!")
|
||||
channel_time = 200 // This is a strong fucking weapon, 20 seconds channel time is getting off light I tell ya.
|
||||
power_cost = 75000 //75 KW
|
||||
usage_tip = "Neovgre is a powerful mech that will crush your enemies!"
|
||||
invokers_required = 5
|
||||
multiple_invokers_used = TRUE
|
||||
object_path = /obj/mecha/combat/neovgre
|
||||
object_path = /obj/vehicle/sealed/mecha/combat/neovgre
|
||||
tier = SCRIPTURE_APPLICATION
|
||||
primary_component = BELLIGERENT_EYE
|
||||
sort_priority = 8
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
var/construction_value = 0 //How much value the structure contributes to the overall "power" of the structures on the station
|
||||
var/immune_to_servant_attacks = FALSE //if we ignore attacks from servants of ratvar instead of taking damage
|
||||
|
||||
/obj/structure/destructible/clockwork/Initialize()
|
||||
/obj/structure/destructible/clockwork/Initialize(mapload)
|
||||
. = ..()
|
||||
change_construction_value(construction_value)
|
||||
GLOB.all_clockwork_objects += src
|
||||
@@ -72,11 +72,6 @@
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/structure/destructible/clockwork/mech_melee_attack(obj/mecha/M)
|
||||
if(M.occupant && is_servant_of_ratvar(M.occupant) && immune_to_servant_attacks)
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/structure/destructible/clockwork/proc/get_efficiency_mod()
|
||||
if(GLOB.ratvar_awakens)
|
||||
return 2
|
||||
@@ -134,7 +129,7 @@
|
||||
density = FALSE
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF | FREEZE_PROOF
|
||||
|
||||
/obj/structure/destructible/clockwork/massive/Initialize()
|
||||
/obj/structure/destructible/clockwork/massive/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.poi_list += src
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
clockwork_desc = "A trap that shouldn't exist, and you should report this as a bug."
|
||||
var/list/wired_to
|
||||
|
||||
/obj/structure/destructible/clockwork/trap/Initialize()
|
||||
/obj/structure/destructible/clockwork/trap/Initialize(mapload)
|
||||
. = ..()
|
||||
wired_to = list()
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
break_message = "<span class='warning'>The trigger breaks apart!</span>"
|
||||
density = FALSE
|
||||
|
||||
/obj/structure/destructible/clockwork/trap/trigger/Initialize()
|
||||
/obj/structure/destructible/clockwork/trap/trigger/Initialize(mapload)
|
||||
. = ..()
|
||||
for(var/obj/structure/destructible/clockwork/trap/T in get_turf(src))
|
||||
if(!istype(T, /obj/structure/destructible/clockwork/trap/trigger))
|
||||
|
||||
+3
-3
@@ -33,7 +33,7 @@
|
||||
var/recalls_remaining = 1
|
||||
var/recalling
|
||||
|
||||
/obj/structure/destructible/clockwork/massive/celestial_gateway/Initialize()
|
||||
/obj/structure/destructible/clockwork/massive/celestial_gateway/Initialize(mapload)
|
||||
. = ..()
|
||||
INVOKE_ASYNC(src, .proc/spawn_animation)
|
||||
glow = new(get_turf(src))
|
||||
@@ -199,7 +199,7 @@
|
||||
|
||||
/obj/structure/destructible/clockwork/massive/celestial_gateway/ex_act(severity, target, origin)
|
||||
var/damage = max((obj_integrity * 0.7) / severity, 100) //requires multiple bombs to take down
|
||||
take_damage(damage, BRUTE, "bomb", 0)
|
||||
take_damage(damage, BRUTE, BOMB, 0)
|
||||
|
||||
/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/get_arrival_time(var/deciseconds = TRUE)
|
||||
if(seconds_until_activation)
|
||||
@@ -301,7 +301,7 @@
|
||||
for(var/obj/O in orange(1, src))
|
||||
if(!O.pulledby && !iseffect(O) && O.density)
|
||||
if(!step_away(O, src, 2) || get_dist(O, src) < 2)
|
||||
O.take_damage(50, BURN, "bomb")
|
||||
O.take_damage(50, BURN, BOMB)
|
||||
O.update_icon()
|
||||
|
||||
conversion_pulse() //Converts the nearby area into clockcult-style
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
var/hierophant_cost = MIN_CLOCKCULT_POWER //how much it costs to broadcast with large text
|
||||
var/gateway_cost = 2000 //how much it costs to open a gateway
|
||||
|
||||
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/Initialize()
|
||||
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/Initialize(mapload)
|
||||
. = ..()
|
||||
toggle(1)
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
var/votes_needed = 0 //How many votes are needed to activate the beacon
|
||||
var/available = FALSE //If the beacon can be used
|
||||
|
||||
/obj/structure/destructible/clockwork/heralds_beacon/Initialize()
|
||||
/obj/structure/destructible/clockwork/heralds_beacon/Initialize(mapload)
|
||||
. = ..()
|
||||
voters = list()
|
||||
START_PROCESSING(SSprocessing, src)
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
var/atom/movable/target
|
||||
var/list/idle_messages = list(" sulkily glares around.", " lazily drifts from side to side.", " looks around for something to burn.", " slowly turns in circles.")
|
||||
|
||||
/obj/structure/destructible/clockwork/ocular_warden/Initialize()
|
||||
/obj/structure/destructible/clockwork/ocular_warden/Initialize(mapload)
|
||||
. = ..()
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
|
||||
@@ -76,8 +76,8 @@
|
||||
L.adjust_fire_stacks(damage_per_tick)
|
||||
L.IgniteMob()
|
||||
else if(ismecha(target))
|
||||
var/obj/mecha/M = target
|
||||
M.take_damage(damage_per_tick * get_efficiency_mod(), BURN, "melee", 1, get_dir(src, M))
|
||||
var/obj/vehicle/sealed/mecha/M = target
|
||||
M.take_damage(damage_per_tick * get_efficiency_mod(), BURN, MELEE, 1, get_dir(src, M))
|
||||
|
||||
new /obj/effect/temp_visual/ratvar/ocular_warden(get_turf(target))
|
||||
|
||||
@@ -91,8 +91,8 @@
|
||||
var/mob/living/L = target
|
||||
to_chat(L, "<span class='neovgre'>\"I SEE YOU!\"</span>\n<span class='userdanger'>[src]'s gaze [GLOB.ratvar_awakens ? "melts you alive" : "burns you"]!</span>")
|
||||
else if(ismecha(target))
|
||||
var/obj/mecha/M = target
|
||||
to_chat(M.occupant, "<span class='neovgre'>\"I SEE YOU!\"</span>" )
|
||||
var/obj/vehicle/sealed/mecha/M = target
|
||||
to_chat(M.occupants, "<span class='neovgre'>\"I SEE YOU!\"</span>" )
|
||||
else if(prob(0.5)) //Extremely low chance because of how fast the subsystem it uses processes
|
||||
if(prob(50))
|
||||
visible_message("<span class='notice'>[src][pick(idle_messages)]</span>")
|
||||
@@ -131,8 +131,11 @@
|
||||
. += L
|
||||
var/list/viewcache = list()
|
||||
for(var/N in GLOB.mechas_list)
|
||||
var/obj/mecha/M = N
|
||||
if(get_dist(M, src) <= sight_range && M.occupant && !is_servant_of_ratvar(M.occupant))
|
||||
var/obj/vehicle/sealed/mecha/M = N
|
||||
if(get_dist(M, src) <= sight_range && LAZYLEN(M.occupants))
|
||||
for(var/mob/living/MB in M.occupants)
|
||||
if(is_servant_of_ratvar(MB))
|
||||
return
|
||||
if(!length(viewcache))
|
||||
for (var/obj/Z in view(sight_range, src))
|
||||
viewcache += Z
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@
|
||||
var/convert_range = 10
|
||||
obj_flags = CAN_BE_HIT | DANGEROUS_POSSESSION
|
||||
|
||||
/obj/structure/destructible/clockwork/massive/ratvar/Initialize()
|
||||
/obj/structure/destructible/clockwork/massive/ratvar/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.ratvar_awakens++
|
||||
for(var/obj/O in GLOB.all_clockwork_objects)
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
var/ini_dir = null
|
||||
|
||||
/obj/structure/destructible/clockwork/reflector/Initialize()
|
||||
/obj/structure/destructible/clockwork/reflector/Initialize(mapload)
|
||||
. = ..()
|
||||
allowed_projectile_typecache = typecacheof(allowed_projectile_typecache)
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
light_color = "#DAAA18"
|
||||
var/star_light_star_bright = FALSE //If this stargazer can see starlight
|
||||
|
||||
/obj/structure/destructible/clockwork/stargazer/Initialize()
|
||||
/obj/structure/destructible/clockwork/stargazer/Initialize(mapload)
|
||||
. = ..()
|
||||
START_PROCESSING(SSprocessing, src)
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
debris = list()
|
||||
var/timerid
|
||||
|
||||
/obj/structure/destructible/clockwork/taunting_trail/Initialize()
|
||||
/obj/structure/destructible/clockwork/taunting_trail/Initialize(mapload)
|
||||
. = ..()
|
||||
timerid = QDEL_IN(src, 15)
|
||||
var/obj/structure/destructible/clockwork/taunting_trail/Tt = locate(/obj/structure/destructible/clockwork/taunting_trail) in loc
|
||||
|
||||
+6
-4
@@ -9,12 +9,14 @@
|
||||
|
||||
/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech/Crossed(atom/movable/AM)
|
||||
. = ..()
|
||||
if(!istype(AM,/obj/mecha/))
|
||||
if(!istype(AM,/obj/vehicle/sealed/mecha/))
|
||||
return
|
||||
|
||||
var/obj/mecha/M = AM
|
||||
if(M.occupant && is_servant_of_ratvar(M.occupant))
|
||||
return
|
||||
var/obj/vehicle/sealed/mecha/M = AM
|
||||
if(LAZYLEN(M.occupants))
|
||||
for(var/mob/living/MB in M.occupants)
|
||||
if(is_servant_of_ratvar(MB))
|
||||
return
|
||||
audible_message("<i>*click*</i>")
|
||||
playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE)
|
||||
activate()
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
var/wiggle_wiggle
|
||||
var/mutable_appearance/impale_overlay //This is applied to any mob impaled so that they visibly have the skewer coming through their chest
|
||||
|
||||
/obj/structure/destructible/clockwork/trap/brass_skewer/Initialize()
|
||||
/obj/structure/destructible/clockwork/trap/brass_skewer/Initialize(mapload)
|
||||
. = ..()
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
|
||||
@@ -68,9 +68,9 @@
|
||||
mouse_opacity = MOUSE_OPACITY_OPAQUE //So players can interact with the tile it's on to pull them off
|
||||
buckle_mob(squirrel, TRUE)
|
||||
else
|
||||
var/obj/mecha/M = locate() in get_turf(src)
|
||||
var/obj/vehicle/sealed/mecha/M = locate() in get_turf(src)
|
||||
if(M)
|
||||
M.take_damage(50,BRUTE,"melee")
|
||||
M.take_damage(50,BRUTE,MELEE)
|
||||
M.visible_message("<span class='danger'>A massive brass spike erupts from the ground, penetrating \the [M] and shattering the trap into pieces!</span>")
|
||||
addtimer(CALLBACK(src, .proc/take_damage, max_integrity), 1)
|
||||
else
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
/obj/structure/destructible/clockwork/wall_gear/displaced
|
||||
anchored = FALSE
|
||||
|
||||
/obj/structure/destructible/clockwork/wall_gear/Initialize()
|
||||
/obj/structure/destructible/clockwork/wall_gear/Initialize(mapload)
|
||||
. = ..()
|
||||
new /obj/effect/temp_visual/ratvar/gear(get_turf(src))
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
armour_penetration = 35
|
||||
actions_types = list(/datum/action/item_action/cult_dagger)
|
||||
|
||||
/obj/item/melee/cultblade/dagger/Initialize()
|
||||
/obj/item/melee/cultblade/dagger/Initialize(mapload)
|
||||
. = ..()
|
||||
var/image/I = image(icon = 'icons/effects/blood.dmi' , icon_state = null, loc = src)
|
||||
I.override = TRUE
|
||||
@@ -62,7 +62,7 @@
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended")
|
||||
|
||||
/obj/item/melee/cultblade/Initialize()
|
||||
/obj/item/melee/cultblade/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/butchering, 40, 100)
|
||||
AddElement(/datum/element/sword_point)
|
||||
@@ -87,7 +87,7 @@
|
||||
item_flags = NEEDS_PERMIT | DROPDEL
|
||||
flags_1 = NONE
|
||||
|
||||
/obj/item/melee/cultblade/ghost/Initialize()
|
||||
/obj/item/melee/cultblade/ghost/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
var/spin_cooldown = 250
|
||||
var/dash_toggled = TRUE
|
||||
|
||||
/obj/item/cult_bastard/Initialize()
|
||||
/obj/item/cult_bastard/Initialize(mapload)
|
||||
. = ..()
|
||||
set_light(4)
|
||||
jaunt = new(src)
|
||||
@@ -297,7 +297,7 @@
|
||||
desc = "A torn, dust-caked hood. Strange letters line the inside."
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEEARS
|
||||
flags_cover = HEADCOVERSEYES
|
||||
armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 20, "bomb" = 65, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10)
|
||||
armor = list(MELEE = 40, BULLET = 30, LASER = 40,ENERGY = 20, BOMB = 65, BIO = 10, RAD = 0, FIRE = 10, ACID = 10)
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
|
||||
heat_protection = HEAD
|
||||
@@ -310,7 +310,7 @@
|
||||
item_state = "cultrobes"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
|
||||
armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 20, "bomb" = 65, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10)
|
||||
armor = list(MELEE = 40, BULLET = 30, LASER = 40,ENERGY = 20, BOMB = 65, BIO = 10, RAD = 0, FIRE = 10, ACID = 10)
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
cold_protection = CHEST|GROIN|LEGS|ARMS
|
||||
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
|
||||
@@ -326,7 +326,7 @@
|
||||
/obj/item/clothing/head/culthood/alt/ghost
|
||||
item_flags = DROPDEL
|
||||
|
||||
/obj/item/clothing/head/culthood/alt/ghost/Initialize()
|
||||
/obj/item/clothing/head/culthood/alt/ghost/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
|
||||
|
||||
@@ -340,7 +340,7 @@
|
||||
/obj/item/clothing/suit/cultrobes/alt/ghost
|
||||
item_flags = DROPDEL
|
||||
|
||||
/obj/item/clothing/suit/cultrobes/alt/ghost/Initialize()
|
||||
/obj/item/clothing/suit/cultrobes/alt/ghost/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
|
||||
|
||||
@@ -350,7 +350,7 @@
|
||||
item_state = "magus"
|
||||
desc = "A helm worn by the followers of Nar'Sie."
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEARS|HIDEEYES|HIDESNOUT
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 10)
|
||||
armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 10, ACID = 10)
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
@@ -361,7 +361,7 @@
|
||||
item_state = "magusred"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
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)
|
||||
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
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/cult
|
||||
@@ -369,7 +369,7 @@
|
||||
desc = "A heavily-armored helmet worn by warriors of the Nar'Sien cult. It can withstand hard vacuum."
|
||||
icon_state = "cult_helmet"
|
||||
item_state = "cult_helmet"
|
||||
armor = list("melee" = 60, "bullet" = 50, "laser" = 30,"energy" = 15, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 40, "acid" = 75)
|
||||
armor = list(MELEE = 60, BULLET = 50, LASER = 30,ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 40, ACID = 75)
|
||||
brightness_on = 0
|
||||
actions_types = list()
|
||||
|
||||
@@ -385,7 +385,7 @@
|
||||
desc = "A heavily-armored exosuit worn by warriors of the Nar'Sien cult. It can withstand hard vacuum."
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
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)
|
||||
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/clothing/suit/space/hardsuit/cult/ComponentInitialize()
|
||||
@@ -413,7 +413,7 @@
|
||||
icon_state = "cult_armor"
|
||||
item_state = "cult_armor"
|
||||
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)
|
||||
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/tome, /obj/item/melee/cultblade)
|
||||
var/current_charges = 3
|
||||
@@ -423,7 +423,7 @@
|
||||
name = "empowered cultist armor"
|
||||
desc = "Empowered garb which creates a powerful shield around the user."
|
||||
icon_state = "cult_hoodalt"
|
||||
armor = list("melee" = 50, "bullet" = 40, "laser" = 50,"energy" = 30, "bomb" = 50, "bio" = 30, "rad" = 30, "fire" = 50, "acid" = 50)
|
||||
armor = list(MELEE = 50, BULLET = 40, LASER = 50,ENERGY = 30, BOMB = 50, BIO = 30, RAD = 30, FIRE = 50, ACID = 50)
|
||||
body_parts_covered = HEAD
|
||||
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
|
||||
|
||||
@@ -473,7 +473,7 @@
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
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)
|
||||
armor = list(MELEE = -50, BULLET = -50, LASER = -50,ENERGY = -50, BOMB = -50, BIO = -50, RAD = -50, FIRE = 0, ACID = 0)
|
||||
slowdown = -1
|
||||
hoodtype = /obj/item/clothing/head/hooded/berserkerhood
|
||||
|
||||
@@ -483,7 +483,7 @@
|
||||
icon_state = "culthood"
|
||||
body_parts_covered = HEAD
|
||||
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
|
||||
armor = list("melee" = -50, "bullet" = -50, "laser" = -50, "energy" = -50, "bomb" = -50, "bio" = -50, "rad" = -50, "fire" = 0, "acid" = 0)
|
||||
armor = list(MELEE = -50, BULLET = -50, LASER = -50, ENERGY = -50, BOMB = -50, BIO = -50, RAD = -50, FIRE = 0, ACID = 0)
|
||||
|
||||
/obj/item/clothing/suit/hooded/cultrobes/berserker/equipped(mob/living/user, slot)
|
||||
..()
|
||||
@@ -716,7 +716,7 @@
|
||||
var/wielded = FALSE // track wielded status on item
|
||||
|
||||
|
||||
/obj/item/cult_spear/Initialize()
|
||||
/obj/item/cult_spear/Initialize(mapload)
|
||||
. = ..()
|
||||
RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield)
|
||||
RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield)
|
||||
@@ -874,7 +874,7 @@
|
||||
var/firing = FALSE
|
||||
var/angle
|
||||
|
||||
/obj/item/blood_beam/Initialize()
|
||||
/obj/item/blood_beam/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
var/static/image/radial_shell = image(icon = 'icons/obj/wizard.dmi', icon_state = "construct-cult")
|
||||
var/static/image/radial_unholy_water = image(icon = 'icons/obj/drinks.dmi', icon_state = "holyflask")
|
||||
|
||||
/obj/structure/destructible/cult/talisman/Initialize()
|
||||
/obj/structure/destructible/cult/talisman/Initialize(mapload)
|
||||
. = ..()
|
||||
radial_unholy_water.color = "#333333"
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ This file contains the cult dagger and rune list code
|
||||
*/
|
||||
|
||||
|
||||
/obj/item/melee/cultblade/dagger/Initialize()
|
||||
/obj/item/melee/cultblade/dagger/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!LAZYLEN(GLOB.rune_types))
|
||||
GLOB.rune_types = list()
|
||||
|
||||
@@ -832,7 +832,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
var/ghost_limit = 3
|
||||
var/ghosts = 0
|
||||
|
||||
/obj/effect/rune/manifest/Initialize()
|
||||
/obj/effect/rune/manifest/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
Though you are not obligated to help, perhaps by aiding a higher ranking devil, you might just get a promotion. However, you are incapable \
|
||||
of intentionally harming a fellow devil.</B>"
|
||||
|
||||
/mob/living/simple_animal/imp/Initialize()
|
||||
/mob/living/simple_animal/imp/Initialize(mapload)
|
||||
..()
|
||||
boost = world.time + 30
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
var/mob/living/oldform
|
||||
var/list/devil_overlays[DEVIL_TOTAL_LAYERS]
|
||||
|
||||
/mob/living/carbon/true_devil/Initialize()
|
||||
/mob/living/carbon/true_devil/Initialize(mapload)
|
||||
create_bodyparts() //initialize bodyparts
|
||||
create_internal_organs()
|
||||
grant_all_languages()
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
///Used mainly for summoning ritual to prevent spamming the rune to create millions of monsters.
|
||||
var/is_in_use = FALSE
|
||||
|
||||
/obj/effect/eldritch/Initialize()
|
||||
/obj/effect/eldritch/Initialize(mapload)
|
||||
. = ..()
|
||||
var/image/I = image(icon = 'icons/effects/eldritch.dmi', icon_state = null, loc = src)
|
||||
I.override = TRUE
|
||||
@@ -216,7 +216,7 @@
|
||||
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
alpha = 0
|
||||
|
||||
/obj/effect/broken_illusion/Initialize()
|
||||
/obj/effect/broken_illusion/Initialize(mapload)
|
||||
. = ..()
|
||||
addtimer(CALLBACK(src,.proc/show_presence),15 SECONDS)
|
||||
addtimer(CALLBACK(src,.proc/remove_presence),195 SECONDS)
|
||||
@@ -295,7 +295,7 @@
|
||||
///Tracked image
|
||||
var/image/img
|
||||
|
||||
/obj/effect/reality_smash/Initialize()
|
||||
/obj/effect/reality_smash/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.reality_smash_track.smashes += src
|
||||
img = image(icon, src, image_state, OBJ_LAYER)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
var/mob/living/carbon/human/target
|
||||
var/datum/antagonist/heretic/sac_targetter //The heretic who used this to acquire the current target - gets cleared when target gets sacrificed.
|
||||
|
||||
/obj/item/living_heart/Initialize()
|
||||
/obj/item/living_heart/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.living_heart_cache.Add(src) //Add is better than +=.
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
allowed = list(/obj/item/melee/sickly_blade, /obj/item/forbidden_book, /obj/item/living_heart)
|
||||
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch
|
||||
// slightly better than normal cult robes
|
||||
armor = list("melee" = 50, "bullet" = 50, "laser" = 50,"energy" = 50, "bomb" = 35, "bio" = 20, "rad" = 0, "fire" = 20, "acid" = 20)
|
||||
armor = list(MELEE = 50, BULLET = 50, LASER = 50,ENERGY = 50, BOMB = 35, BIO = 20, RAD = 0, FIRE = 20, ACID = 20)
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/eldritch
|
||||
@@ -193,7 +193,7 @@
|
||||
flags_inv = NONE
|
||||
flags_cover = NONE
|
||||
desc = "Black like tar, doesn't reflect any light. Runic symbols line the outside, with each flash you lose comprehension of what you are seeing."
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 15, BIO = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
obj_flags = NONE | EXAMINE_SKIP
|
||||
|
||||
/obj/item/clothing/suit/hooded/cultrobes/void
|
||||
@@ -205,7 +205,7 @@
|
||||
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/void
|
||||
flags_inv = NONE
|
||||
// slightly worse than normal cult robes
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 15, BIO = 0, RAD = 0, FIRE = 0, ACID = 0)
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/void_cloak
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
|
||||
|
||||
@@ -310,7 +310,7 @@
|
||||
. += "This item can carve 'Grasping carving' - when stepped on it causes heavy damage to the legs and stuns for 5 seconds."
|
||||
. += "This item can carve 'Mad carving' - when stepped on it causes dizzyness, jiterryness, temporary blindness, confusion , stuttering and slurring."
|
||||
|
||||
/obj/item/melee/rune_knife/Initialize()
|
||||
/obj/item/melee/rune_knife/Initialize(mapload)
|
||||
. = ..()
|
||||
linked_action = new(src)
|
||||
|
||||
|
||||
@@ -402,11 +402,11 @@
|
||||
new /obj/effect/hotspot(T)
|
||||
T.hotspot_expose(700,50,1)
|
||||
// deals damage to mechs
|
||||
for(var/obj/mecha/M in T.contents)
|
||||
for(var/obj/vehicle/sealed/mecha/M in T.contents)
|
||||
if(M in hit_list)
|
||||
continue
|
||||
hit_list += M
|
||||
M.take_damage(45, BURN, "melee", 1)
|
||||
M.take_damage(45, BURN, MELEE, 1)
|
||||
sleep(1.5)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/shapeshift/eldritch
|
||||
@@ -702,7 +702,7 @@
|
||||
duration = 1 MINUTES
|
||||
layer = LOW_SIGIL_LAYER
|
||||
|
||||
/obj/effect/temp_visual/glowing_rune/Initialize()
|
||||
/obj/effect/temp_visual/glowing_rune/Initialize(mapload)
|
||||
. = ..()
|
||||
pixel_y = rand(-6,6)
|
||||
pixel_x = rand(-6,6)
|
||||
|
||||
@@ -9,7 +9,7 @@ GLOBAL_LIST_EMPTY(gangster_cell_phones)
|
||||
var/gang_id = "Grove Street Families"
|
||||
var/activated = FALSE
|
||||
|
||||
/obj/item/gangster_cellphone/Initialize()
|
||||
/obj/item/gangster_cellphone/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.gangster_cell_phones += src
|
||||
flags_1 |= HEAR_1
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
You can attack any item or dead creature to consume it - creatures will fully restore your health. \
|
||||
Finally, you can restore yourself to your original form while morphed by shift-clicking yourself.</b>"
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/Initialize()
|
||||
/mob/living/simple_animal/hostile/morph/Initialize(mapload)
|
||||
. = ..()
|
||||
src.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer", "Vale")
|
||||
|
||||
|
||||
/obj/item/borg_chameleon/Initialize()
|
||||
/obj/item/borg_chameleon/Initialize(mapload)
|
||||
. = ..()
|
||||
friendlyName = pick(GLOB.ai_names)
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
var/proper_bomb = TRUE //Please
|
||||
var/obj/effect/countdown/nuclearbomb/countdown
|
||||
|
||||
/obj/machinery/nuclearbomb/Initialize()
|
||||
/obj/machinery/nuclearbomb/Initialize(mapload)
|
||||
. = ..()
|
||||
countdown = new(src)
|
||||
GLOB.nuke_list += src
|
||||
@@ -507,7 +507,7 @@
|
||||
proper_bomb = FALSE
|
||||
var/obj/structure/reagent_dispensers/beerkeg/keg
|
||||
|
||||
/obj/machinery/nuclearbomb/beer/Initialize()
|
||||
/obj/machinery/nuclearbomb/beer/Initialize(mapload)
|
||||
. = ..()
|
||||
keg = new(src)
|
||||
QDEL_NULL(core)
|
||||
@@ -612,14 +612,14 @@ This is here to make the tiles around the station mininuke change when it's arme
|
||||
icon_state = "nucleardisk"
|
||||
persistence_replacement = /obj/item/disk/nuclear/fake
|
||||
max_integrity = 250
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
var/fake = FALSE
|
||||
var/turf/lastlocation
|
||||
var/last_disk_move
|
||||
var/process_tick = 0
|
||||
|
||||
/obj/item/disk/nuclear/Initialize()
|
||||
/obj/item/disk/nuclear/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/bed_tuckable, 6, -6, 0)
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
flags_1 = NONE
|
||||
|
||||
|
||||
/obj/item/pinpointer/syndicate_cyborg/Initialize()
|
||||
/obj/item/pinpointer/syndicate_cyborg/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT)
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
target = closest_operative
|
||||
..()
|
||||
|
||||
/obj/item/pinpointer/spider_cyborg/Initialize()
|
||||
/obj/item/pinpointer/spider_cyborg/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT)
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
var/slam_mode = FALSE
|
||||
var/datum/action/cooldown/slam
|
||||
|
||||
/mob/living/simple_animal/slaughter/Initialize()
|
||||
/mob/living/simple_animal/slaughter/Initialize(mapload)
|
||||
..()
|
||||
var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
|
||||
AddSpell(bloodspell)
|
||||
@@ -282,7 +282,7 @@
|
||||
T = find_safe_turf()
|
||||
for(var/mob/living/M in consumed_mobs)
|
||||
if(!M)
|
||||
continue
|
||||
continue
|
||||
M.forceMove(T)
|
||||
if(M.revive(full_heal = TRUE, admin_revive = TRUE))
|
||||
M.grab_ghost(force = TRUE)
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
3. Biological resources will be harvested at a later date; do not harm them.
|
||||
"}
|
||||
|
||||
/obj/effect/mob_spawn/swarmer/Initialize()
|
||||
/obj/effect/mob_spawn/swarmer/Initialize(mapload)
|
||||
. = ..()
|
||||
var/area/A = get_area(src)
|
||||
if(A)
|
||||
@@ -106,7 +106,7 @@
|
||||
var/resources = 0 //Resource points, generated by consuming metal/glass
|
||||
var/max_resources = 100
|
||||
|
||||
/mob/living/simple_animal/hostile/swarmer/Initialize()
|
||||
/mob/living/simple_animal/hostile/swarmer/Initialize(mapload)
|
||||
. = ..()
|
||||
remove_verb(src, /mob/living/verb/pulled)
|
||||
for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
|
||||
@@ -139,12 +139,12 @@
|
||||
else
|
||||
death()
|
||||
|
||||
/mob/living/simple_animal/hostile/swarmer/CanPass(atom/movable/O)
|
||||
/mob/living/simple_animal/hostile/swarmer/CanAllowThrough(atom/movable/O)
|
||||
. = ..()
|
||||
if(istype(O, /obj/item/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other
|
||||
return 1
|
||||
if(isswarmer(O))
|
||||
return 1
|
||||
..()
|
||||
|
||||
////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S////
|
||||
/mob/living/simple_animal/hostile/swarmer/AttackingTarget()
|
||||
@@ -607,7 +607,7 @@
|
||||
icon_state = "disintegrate"
|
||||
duration = 10
|
||||
|
||||
/obj/effect/temp_visual/swarmer/disintegration/Initialize()
|
||||
/obj/effect/temp_visual/swarmer/disintegration/Initialize(mapload)
|
||||
. = ..()
|
||||
playsound(loc, "sparks", 100, 1)
|
||||
|
||||
@@ -698,11 +698,12 @@
|
||||
light_range = MINIMUM_USEFUL_LIGHT_RANGE
|
||||
max_integrity = 50
|
||||
|
||||
/obj/structure/swarmer/blockade/CanPass(atom/movable/O)
|
||||
/obj/structure/swarmer/blockade/CanAllowThrough(atom/movable/O)
|
||||
. = ..()
|
||||
if(isswarmer(O))
|
||||
return 1
|
||||
return TRUE
|
||||
if(istype(O, /obj/item/projectile/beam/disabler))
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/swarmer/proc/CreateSwarmer()
|
||||
set name = "Replicate"
|
||||
|
||||
@@ -355,7 +355,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
var/detonation_timer
|
||||
var/next_announce
|
||||
|
||||
/obj/machinery/doomsday_device/Initialize()
|
||||
/obj/machinery/doomsday_device/Initialize(mapload)
|
||||
. = ..()
|
||||
countdown = new(src)
|
||||
|
||||
|
||||
@@ -444,6 +444,6 @@
|
||||
duration = 40
|
||||
pixel_x = 500
|
||||
|
||||
/obj/effect/temp_visual/tornado/Initialize()
|
||||
/obj/effect/temp_visual/tornado/Initialize(mapload)
|
||||
. = ..()
|
||||
animate(src, pixel_x = -500, time = 40)
|
||||
|
||||
@@ -618,7 +618,7 @@
|
||||
else
|
||||
. += "It appears to have no author."
|
||||
|
||||
/obj/item/spellbook/Initialize()
|
||||
/obj/item/spellbook/Initialize(mapload)
|
||||
. = ..()
|
||||
prepare_spells()
|
||||
|
||||
|
||||
@@ -228,6 +228,8 @@
|
||||
give_genital(/obj/item/organ/genital/breasts)
|
||||
if(dna.features["has_cock"])
|
||||
give_genital(/obj/item/organ/genital/penis)
|
||||
if(dna.features["has_butt"])
|
||||
give_genital(/obj/item/organ/genital/butt)
|
||||
|
||||
/mob/living/carbon/human/proc/give_genital(obj/item/organ/genital/G)
|
||||
if(!dna || (NOGENITALS in dna.species.species_traits) || getorganslot(initial(G.slot)))
|
||||
@@ -285,6 +287,8 @@
|
||||
S = GLOB.vagina_shapes_list[G.shape]
|
||||
if(/obj/item/organ/genital/breasts)
|
||||
S = GLOB.breasts_shapes_list[G.shape]
|
||||
if(/obj/item/organ/genital/butt)
|
||||
S = GLOB.butt_shapes_list[G.shape]
|
||||
|
||||
if(!S || S.icon_state == "none")
|
||||
continue
|
||||
@@ -317,6 +321,8 @@
|
||||
genital_overlay.color = "#[dna.features["breasts_color"]]"
|
||||
if("vag_color")
|
||||
genital_overlay.color = "#[dna.features["vag_color"]]"
|
||||
if("butt_color")
|
||||
genital_overlay.color = "#[dna.features["butt_color"]]"
|
||||
|
||||
genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size][(dna.species.use_skintones && !dna.skin_tone_override) ? "_s" : ""]_[aroused_state]_[layertext]"
|
||||
|
||||
@@ -346,20 +352,30 @@
|
||||
var/organCheck = locate(/obj/item/organ/genital) in internal_organs
|
||||
var/breastCheck = getorganslot(ORGAN_SLOT_BREASTS)
|
||||
var/willyCheck = getorganslot(ORGAN_SLOT_PENIS)
|
||||
var/buttCheck = getorganslot(ORGAN_SLOT_BUTT)
|
||||
var/ballCheck = getorganslot(ORGAN_SLOT_TESTICLES)
|
||||
|
||||
if(organCheck == FALSE)
|
||||
if(ishuman(src) && dna.species.use_skintones)
|
||||
dna.features["genitals_use_skintone"] = TRUE
|
||||
if(src.dna.species.fixed_mut_color)
|
||||
if(dna.species.fixed_mut_color)
|
||||
dna.features["cock_color"] = "[dna.species.fixed_mut_color]"
|
||||
dna.features["breasts_color"] = "[dna.species.fixed_mut_color]"
|
||||
dna.features["butt_color"] = "[dna.species.fixed_mut_color]"
|
||||
dna.features["testicles_color"] = "[dna.species.fixed_mut_color]"
|
||||
return
|
||||
//So people who haven't set stuff up don't get rainbow surprises.
|
||||
dna.features["cock_color"] = "[dna.features["mcolor"]]"
|
||||
dna.features["breasts_color"] = "[dna.features["mcolor"]]"
|
||||
dna.features["butt_color"] = "[dna.features["mcolor"]]"
|
||||
dna.features["testicles_color"] = "[dna.features["mcolor"]]"
|
||||
else //If there's a new organ, make it the same colour.
|
||||
if(breastCheck == FALSE)
|
||||
dna.features["breasts_color"] = dna.features["cock_color"]
|
||||
else if (willyCheck == FALSE)
|
||||
dna.features["cock_color"] = dna.features["breasts_color"]
|
||||
else if (buttCheck == FALSE)
|
||||
dna.features["butt_color"] = dna.features["butt_color"]
|
||||
else if (ballCheck == FALSE)
|
||||
dna.features["testicles_color"] = dna.features["testicles_color"]
|
||||
return TRUE
|
||||
|
||||
@@ -64,6 +64,10 @@
|
||||
icon_state = "single"
|
||||
name = "Single" //Single as "single pair", for clarity.
|
||||
|
||||
/datum/sprite_accessory/testicles/hidden
|
||||
icon_state = "hidden"
|
||||
name = "Hidden" //not sure why these were missing, but I'm pretty certain people might want these.
|
||||
|
||||
//Vaginas
|
||||
/datum/sprite_accessory/vagina
|
||||
icon = 'icons/obj/genitals/vagina_onmob.dmi'
|
||||
@@ -119,3 +123,15 @@
|
||||
/datum/sprite_accessory/breasts/sextuple
|
||||
icon_state = "sextuple"
|
||||
name = "Sextuple"
|
||||
|
||||
//BUTT BE HERE
|
||||
/datum/sprite_accessory/butt
|
||||
icon = 'icons/obj/genitals/butt_onmob.dmi'
|
||||
icon_state = "butt"
|
||||
name = "butt"
|
||||
color_src = "butt_color"
|
||||
|
||||
//there literally shouldn't be any other ass types besides one because that'd be weird, this is just here to keep things consistent for the genital system.
|
||||
/datum/sprite_accessory/butt/pair
|
||||
icon_state = "pair"
|
||||
name = "Pair"
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
/obj/item/organ/genital/butt
|
||||
name = "butt"
|
||||
desc = "You see a pair of asscheeks."
|
||||
icon_state = "butt"
|
||||
icon = 'icons/obj/genitals/butt.dmi'
|
||||
zone = BODY_ZONE_PRECISE_GROIN
|
||||
slot = ORGAN_SLOT_BUTT
|
||||
w_class = 3
|
||||
size = 0
|
||||
var/size_name = "nonexistent"
|
||||
shape = "Pair" //turn this into a default constant if for some inexplicable reason we get more than one butt type but I doubt it.
|
||||
genital_flags = UPDATE_OWNER_APPEARANCE|GENITAL_UNDIES_HIDDEN
|
||||
masturbation_verb = "massage"
|
||||
var/size_cached = 0
|
||||
var/prev_size //former size value, to allow update_size() to early return should be there no significant changes.
|
||||
layer_index = BUTT_LAYER_INDEX
|
||||
|
||||
/obj/item/organ/genital/butt/on_life()
|
||||
if(QDELETED(src))
|
||||
return
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
/obj/item/organ/genital/butt/modify_size(modifier, min = -INFINITY, max = BUTT_SIZE_MAX)
|
||||
var/new_value = clamp(size_cached + modifier, min, max)
|
||||
if(new_value == size_cached)
|
||||
return
|
||||
prev_size = size_cached
|
||||
size_cached = new_value
|
||||
size = round(size_cached)
|
||||
update()
|
||||
..()
|
||||
|
||||
/obj/item/organ/genital/butt/update_size()//wah
|
||||
var/rounded_size = round(size)
|
||||
if(size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!fixed
|
||||
if(owner)
|
||||
to_chat(owner, "<span class='warning'>You feel your asscheeks shrink down to an ordinary size.</span>")
|
||||
QDEL_IN(src, 1)
|
||||
return
|
||||
|
||||
if(owner) //Because byond doesn't count from 0, I have to do this.
|
||||
var/mob/living/carbon/human/H = owner
|
||||
var/r_prev_size = round(prev_size)
|
||||
if (rounded_size > r_prev_size)
|
||||
to_chat(H, "<span class='warning'>Your buttcheeks [pick("swell up to", "flourish into", "expand into", "plump up into", "grow eagerly into", "amplify into")] a larger pair.</span>")
|
||||
else if (rounded_size < r_prev_size)
|
||||
to_chat(H, "<span class='warning'>Your buttcheeks [pick("shrink down to", "decrease into", "wobble down into", "diminish into", "deflate into", "contracts into")] a smaller pair.</span>")
|
||||
|
||||
|
||||
/obj/item/organ/genital/butt/update_appearance()
|
||||
var/lowershape = lowertext(shape)
|
||||
|
||||
//Reflect the size of dat ass on examine.
|
||||
switch(round(size))
|
||||
if(1)
|
||||
size_name = "average"
|
||||
if(2)
|
||||
size_name = "sizable"
|
||||
if(3)
|
||||
size_name = "squeezable"
|
||||
if(4)
|
||||
size_name = "hefty"
|
||||
if(5)
|
||||
size_name = pick("massive","extreme","enormous","very generous","humongous","big bubbly","dummy thicc")
|
||||
else
|
||||
size_name = "nonexistent"
|
||||
|
||||
desc = "You see a [lowershape] of [size_name] asscheeks."
|
||||
|
||||
var/icon_size = size
|
||||
icon_state = "butt_[lowershape]_[icon_size]"
|
||||
if(owner)
|
||||
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
|
||||
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
|
||||
var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need.
|
||||
color = SKINTONE2HEX(H.skin_tone)
|
||||
if(!H.dna.skin_tone_override)
|
||||
icon_state += "_s"
|
||||
else
|
||||
color = "#[owner.dna.features["butt_color"]]"
|
||||
|
||||
|
||||
/obj/item/organ/genital/butt/get_features(mob/living/carbon/human/H)
|
||||
var/datum/dna/D = H.dna
|
||||
if(D.species.use_skintones && D.features["genitals_use_skintone"])
|
||||
color = SKINTONE2HEX(H.skin_tone)
|
||||
else
|
||||
color = "#[D.features["butt_color"]]"
|
||||
size = D.features["butt_size"]
|
||||
prev_size = size
|
||||
toggle_visibility(D.features["butt_visibility"], FALSE)
|
||||
@@ -71,7 +71,7 @@
|
||||
update_appearance()
|
||||
return TRUE
|
||||
|
||||
/obj/item/dildo/Initialize()
|
||||
/obj/item/dildo/Initialize(mapload)
|
||||
. = ..()
|
||||
if(random_color == TRUE)
|
||||
var/randcolor = pick(GLOB.dildo_colors)
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
var/turf/listeningTo
|
||||
var/hearing_range = 3
|
||||
|
||||
/obj/item/assembly/infra/Initialize()
|
||||
/obj/item/assembly/infra/Initialize(mapload)
|
||||
. = ..()
|
||||
beams = list()
|
||||
START_PROCESSING(SSobj, src)
|
||||
@@ -220,7 +220,8 @@
|
||||
icon_state = "ibeam"
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
pass_flags = PASSTABLE|PASSGLASS|PASSGRILLE|LETPASSTHROW
|
||||
pass_flags = PASSTABLE|PASSGLASS|PASSGRILLE
|
||||
pass_flags_self = LETPASSTHROW
|
||||
var/obj/item/assembly/infra/master
|
||||
|
||||
/obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
var/sensitivity = 1
|
||||
var/hearing_range = 3
|
||||
|
||||
/obj/item/assembly/prox_sensor/Initialize()
|
||||
/obj/item/assembly/prox_sensor/Initialize(mapload)
|
||||
. = ..()
|
||||
proximity_monitor = new(src, 0)
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
playsound(user, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/assembly/signaler/Initialize()
|
||||
/obj/item/assembly/signaler/Initialize(mapload)
|
||||
. = ..()
|
||||
set_frequency(frequency)
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
user.adjustOxyLoss(200)
|
||||
user.death(0)
|
||||
|
||||
/obj/item/assembly/timer/Initialize()
|
||||
/obj/item/assembly/timer/Initialize(mapload)
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
|
||||
@@ -41,3 +41,18 @@
|
||||
low_alert_datum = /atom/movable/screen/alert/not_enough_tox
|
||||
high_alert_category = "too_much_tox"
|
||||
high_alert_datum = /atom/movable/screen/alert/too_much_tox
|
||||
|
||||
/datum/breathing_class/methane
|
||||
gases = list(
|
||||
GAS_METHANE = 1,
|
||||
GAS_METHYL_BROMIDE = -0.7,
|
||||
GAS_OXYGEN = -0.1,
|
||||
GAS_PLUOXIUM = -0.8
|
||||
)
|
||||
products = list(
|
||||
GAS_METHYL_BROMIDE = 1
|
||||
)
|
||||
low_alert_category = "not_enough_ch4"
|
||||
low_alert_datum = /atom/movable/screen/alert/not_enough_ch4
|
||||
high_alert_category = "too_much_ch4"
|
||||
high_alert_datum = /atom/movable/screen/alert/too_much_ch4
|
||||
|
||||
@@ -7,12 +7,18 @@
|
||||
heat_penalty = 1
|
||||
transmit_modifier = 1.5
|
||||
|
||||
/datum/gas/oxygen/generate_TLV()
|
||||
return new/datum/tlv(16, 19, 40, 50)
|
||||
|
||||
/datum/gas/nitrogen
|
||||
id = GAS_N2
|
||||
specific_heat = 20
|
||||
name = "Nitrogen"
|
||||
powermix = -1
|
||||
heat_penalty = -1.5
|
||||
fire_burn_rate = 1
|
||||
fire_temperature = 2300
|
||||
fire_products = list(GAS_NITRIC = 2)
|
||||
breath_alert_info = list(
|
||||
not_enough_alert = list(
|
||||
alert_category = "not_enough_nitro",
|
||||
@@ -45,6 +51,9 @@
|
||||
fusion_power = 3
|
||||
enthalpy = -393500
|
||||
|
||||
/datum/gas/carbon_dioxide/generate_TLV()
|
||||
return new/datum/tlv(-1, -1, 5, 10)
|
||||
|
||||
/datum/gas/plasma
|
||||
id = GAS_PLASMA
|
||||
specific_heat = 200
|
||||
@@ -57,7 +66,7 @@
|
||||
powermix = 1
|
||||
fire_burn_rate = OXYGEN_BURN_RATE_BASE // named when plasma fires were the only fires, surely
|
||||
fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST
|
||||
fire_products = "plasma_fire"
|
||||
fire_products = FIRE_PRODUCT_PLASMA
|
||||
enthalpy = FIRE_PLASMA_ENERGY_RELEASED // 3000000, 3 megajoules, 3000 kj
|
||||
|
||||
/datum/gas/water_vapor
|
||||
@@ -66,19 +75,13 @@
|
||||
name = "Water Vapor"
|
||||
gas_overlay = "water_vapor"
|
||||
moles_visible = MOLES_GAS_VISIBLE
|
||||
flags = GAS_FLAG_DANGEROUS
|
||||
fusion_power = 8
|
||||
heat_penalty = 8
|
||||
enthalpy = -241800 // FIRE_HYDROGEN_ENERGY_RELEASED is actually what this was supposed to be
|
||||
powermix = 1
|
||||
breath_reagent = /datum/reagent/water
|
||||
|
||||
/datum/gas/hypernoblium
|
||||
id = GAS_HYPERNOB
|
||||
specific_heat = 2000
|
||||
name = "Hyper-noblium"
|
||||
gas_overlay = "freon"
|
||||
moles_visible = MOLES_GAS_VISIBLE
|
||||
|
||||
/datum/gas/nitrous_oxide
|
||||
id = GAS_NITROUS
|
||||
specific_heat = 40
|
||||
@@ -92,31 +95,6 @@
|
||||
enthalpy = 81600
|
||||
heat_resistance = 6
|
||||
|
||||
/datum/gas/nitryl
|
||||
id = GAS_NITRYL
|
||||
specific_heat = 20
|
||||
name = "Nitryl"
|
||||
gas_overlay = "nitryl"
|
||||
moles_visible = MOLES_GAS_VISIBLE
|
||||
flags = GAS_FLAG_DANGEROUS
|
||||
fusion_power = 15
|
||||
fire_products = list(GAS_N2 = 0.5)
|
||||
enthalpy = 33200
|
||||
oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50
|
||||
|
||||
/datum/gas/hydrogen
|
||||
id = GAS_HYDROGEN
|
||||
specific_heat = 10
|
||||
name = "Hydrogen"
|
||||
flags = GAS_FLAG_DANGEROUS
|
||||
fusion_power = 0
|
||||
powermix = 1
|
||||
heat_penalty = 3
|
||||
transmit_modifier = 10
|
||||
fire_products = list(GAS_H2O = 1)
|
||||
fire_burn_rate = 2
|
||||
fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50
|
||||
|
||||
/datum/gas/tritium
|
||||
id = GAS_TRITIUM
|
||||
specific_heat = 10
|
||||
@@ -134,6 +112,51 @@
|
||||
fire_radiation_released = 50 // arbitrary number, basically 60 moles of trit burning will just barely start to harm you
|
||||
fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50
|
||||
|
||||
/datum/gas/nitric_oxide
|
||||
id = GAS_NITRIC
|
||||
specific_heat = 20
|
||||
name = "Nitric oxide"
|
||||
flags = GAS_FLAG_DANGEROUS
|
||||
odor = "sharp sweetness"
|
||||
odor_strength = 1
|
||||
fusion_power = 15
|
||||
enthalpy = 91290
|
||||
heat_resistance = 2
|
||||
|
||||
/datum/gas/nitryl
|
||||
id = GAS_NITRYL
|
||||
specific_heat = 20
|
||||
name = "Nitrogen dioxide"
|
||||
color = "#963"
|
||||
moles_visible = MOLES_GAS_VISIBLE
|
||||
flags = GAS_FLAG_DANGEROUS
|
||||
fusion_power = 15
|
||||
fire_products = list(GAS_N2 = 0.5)
|
||||
enthalpy = 33200
|
||||
oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50
|
||||
|
||||
/datum/gas/hypernoblium
|
||||
id = GAS_HYPERNOB
|
||||
specific_heat = 2000
|
||||
name = "Hyper-noblium"
|
||||
gas_overlay = "freon"
|
||||
moles_visible = MOLES_GAS_VISIBLE
|
||||
|
||||
/datum/gas/hydrogen
|
||||
id = GAS_HYDROGEN
|
||||
specific_heat = 10
|
||||
name = "Hydrogen"
|
||||
flags = GAS_FLAG_DANGEROUS
|
||||
moles_visible = MOLES_GAS_VISIBLE
|
||||
color = "#ffe"
|
||||
fusion_power = 0
|
||||
powermix = 1
|
||||
heat_penalty = 3
|
||||
transmit_modifier = 10
|
||||
fire_products = list(GAS_H2O = 1)
|
||||
fire_burn_rate = 2
|
||||
fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50
|
||||
|
||||
/datum/gas/bz
|
||||
id = GAS_BZ
|
||||
specific_heat = 20
|
||||
@@ -149,6 +172,8 @@
|
||||
/datum/gas/stimulum
|
||||
id = GAS_STIMULUM
|
||||
specific_heat = 5
|
||||
odor = "the color blue" // fast
|
||||
odor_strength = 10
|
||||
name = "Stimulum"
|
||||
fusion_power = 7
|
||||
|
||||
@@ -157,18 +182,23 @@
|
||||
specific_heat = 80
|
||||
name = "Pluoxium"
|
||||
fusion_power = 10
|
||||
oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST * 1000 // it is VERY stable
|
||||
oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST * 25 // it is VERY stable
|
||||
oxidation_rate = 8 // when it can oxidize, it can oxidize a LOT
|
||||
enthalpy = -50000 // but it reduces the heat output a bit
|
||||
enthalpy = -2000000 // but it reduces the heat output a great deal (plasma fires add 3000000 per mole)
|
||||
powermix = -1
|
||||
heat_penalty = -1
|
||||
transmit_modifier = -5
|
||||
heat_resistance = 3
|
||||
|
||||
/datum/gas/pluoxium/generate_TLV()
|
||||
return new/datum/tlv(-1, -1, 5, 6)
|
||||
|
||||
/datum/gas/miasma
|
||||
id = GAS_MIASMA
|
||||
specific_heat = 20
|
||||
fusion_power = 50
|
||||
flags = GAS_FLAG_DANGEROUS
|
||||
// snowflaked odor
|
||||
name = "Miasma"
|
||||
gas_overlay = "miasma"
|
||||
moles_visible = MOLES_GAS_VISIBLE * 60
|
||||
@@ -177,6 +207,9 @@
|
||||
id = GAS_METHANE
|
||||
specific_heat = 30
|
||||
name = "Methane"
|
||||
odor = "natural gas"
|
||||
odor_strength = 2
|
||||
flags = GAS_FLAG_DANGEROUS
|
||||
powerloss_inhibition = 1
|
||||
heat_resistance = 3
|
||||
breath_results = GAS_METHYL_BROMIDE
|
||||
@@ -215,14 +248,18 @@
|
||||
fire_products = list(GAS_CO2 = 1, GAS_H2O = 1.5, GAS_BROMINE = 0.5)
|
||||
enthalpy = -35400
|
||||
fire_burn_rate = 4 / 7 // oh no
|
||||
fire_temperature = 808 // its autoignition, it apparently doesn't spark readily, so i don't put it lower
|
||||
fire_temperature = 808 // its autoignition; it apparently doesn't spark readily, so i don't put it lower
|
||||
|
||||
/datum/gas/bromine
|
||||
id = GAS_BROMINE
|
||||
specific_heat = 76
|
||||
name = "Bromine"
|
||||
flags = GAS_FLAG_DANGEROUS
|
||||
flags = GAS_FLAG_DANGEROUS | GAS_FLAG_CHEMICAL
|
||||
group = GAS_GROUP_CHEMICALS
|
||||
color = "#6e1f00"
|
||||
moles_visible = MOLES_GAS_VISIBLE
|
||||
odor = "bromine" // it's a very recognizable smell
|
||||
odor_strength = 0.1
|
||||
enthalpy = 193 // yeah it's small but it's good to include it
|
||||
breath_reagent = /datum/reagent/bromine
|
||||
|
||||
@@ -230,10 +267,21 @@
|
||||
id = GAS_AMMONIA
|
||||
specific_heat = 35
|
||||
name = "Ammonia"
|
||||
flags = GAS_FLAG_DANGEROUS
|
||||
odor = "ammonia"
|
||||
odor_strength = 0.01
|
||||
flags = GAS_FLAG_DANGEROUS | GAS_FLAG_CHEMICAL
|
||||
group = GAS_GROUP_CHEMICALS
|
||||
enthalpy = -45900
|
||||
breath_reagent = /datum/reagent/ammonia
|
||||
fire_products = list(GAS_H2O = 1.5, GAS_N2 = 0.5)
|
||||
fire_burn_rate = 4/3
|
||||
fire_temperature = 924
|
||||
|
||||
/datum/gas/quark_matter
|
||||
id = GAS_QCD
|
||||
specific_heat = 10
|
||||
name = "Quark Matter"
|
||||
flags = GAS_FLAG_DANGEROUS
|
||||
powermix = -1
|
||||
transmit_modifier = -10
|
||||
heat_penalty = -10
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
var/list/atmos_overlay_types //gas IDs of current active gas overlays
|
||||
|
||||
/turf/open/Initialize()
|
||||
/turf/open/Initialize(mapload)
|
||||
if(!blocks_air)
|
||||
air = new(2500,src)
|
||||
air.copy_from_turf(src)
|
||||
|
||||
@@ -25,6 +25,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GA
|
||||
var/list/ids = list()
|
||||
var/list/typepaths = list()
|
||||
var/list/fusion_powers = list()
|
||||
var/list/TLV = list()
|
||||
var/list/breathing_classes = list()
|
||||
var/list/breath_results = list()
|
||||
var/list/breath_reagents = list()
|
||||
@@ -39,13 +40,18 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GA
|
||||
var/list/supermatter = list()
|
||||
var/list/groups_by_gas = list()
|
||||
var/list/groups = list()
|
||||
var/list/TLVs = list()
|
||||
var/list/odors = list()
|
||||
var/list/odor_strengths = list()
|
||||
|
||||
/datum/gas
|
||||
var/id = ""
|
||||
var/specific_heat = 0
|
||||
var/name = ""
|
||||
var/gas_overlay = "" //icon_state in icons/effects/atmospherics.dmi
|
||||
var/color = "#ffff"
|
||||
var/gas_overlay = "generic" //icon_state in icons/effects/atmospherics.dmi
|
||||
var/color = "#ffff" // Tints the overlay by this color. Use instead of gas_overlay, usually (but not necessarily).
|
||||
var/odor = null // Odor string. Null means none; if not null, anyone who breathes the gas will smell it.
|
||||
var/odor_strength = INFINITY // How strong the odor is; minimal partial pressure to smell, so lower = more.
|
||||
var/moles_visible = null
|
||||
var/flags = NONE //currently used by canisters
|
||||
var/group = null // groups for scrubber/filter listing
|
||||
@@ -68,6 +74,12 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GA
|
||||
var/heat_resistance = 0 // makes the crystal more resistant against heat damage.
|
||||
var/powerloss_inhibition = 0 // Reduces how much power the supermatter loses each tick
|
||||
|
||||
/datum/gas/proc/generate_TLV()
|
||||
if(flags & GAS_FLAG_DANGEROUS)
|
||||
return new/datum/tlv/dangerous
|
||||
else
|
||||
return new/datum/tlv(-1, -1, 1000, 1000)
|
||||
|
||||
/datum/gas/proc/breath(partial_pressure, light_threshold, heavy_threshold, moles, mob/living/carbon/C, obj/item/organ/lungs/lungs)
|
||||
// This is only called on gases with the GAS_FLAG_BREATH_PROC flag. When possible, do NOT use this--
|
||||
// greatly prefer just adding a reagent. This is mostly around for legacy reasons.
|
||||
@@ -79,11 +91,15 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GA
|
||||
datums[g] = gas
|
||||
specific_heats[g] = gas.specific_heat
|
||||
names[g] = gas.name
|
||||
TLVs[g] = gas.generate_TLV()
|
||||
if(gas.moles_visible)
|
||||
visibility[g] = gas.moles_visible
|
||||
overlays[g] = new /list(FACTOR_GAS_VISIBLE_MAX)
|
||||
for(var/i in 1 to FACTOR_GAS_VISIBLE_MAX)
|
||||
overlays[g][i] = new /obj/effect/overlay/gas(gas.gas_overlay, i * 255 / FACTOR_GAS_VISIBLE_MAX)
|
||||
var/obj/effect/overlay/gas/overlay = new(gas.gas_overlay)
|
||||
overlay.color = gas.color
|
||||
overlay.alpha = i * 255 / FACTOR_GAS_VISIBLE_MAX
|
||||
overlays[g][i] = overlay
|
||||
else
|
||||
visibility[g] = 0
|
||||
overlays[g] = 0
|
||||
@@ -114,8 +130,11 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GA
|
||||
if(gas.group)
|
||||
if(!(gas.group in groups))
|
||||
groups[gas.group] = list()
|
||||
groups[gas.group] += gas
|
||||
groups[gas.group] += g
|
||||
groups_by_gas[g] = gas.group
|
||||
if(gas.odor)
|
||||
odor_strengths[g] = gas.odor_strength
|
||||
odors[g] = gas.odor
|
||||
add_supermatter_properties(gas)
|
||||
_auxtools_register_gas(gas)
|
||||
if(done_initializing)
|
||||
@@ -145,6 +164,17 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GA
|
||||
done_initializing = TRUE
|
||||
finalize_gas_refs()
|
||||
|
||||
/datum/auxgm/proc/get_by_flag(flag)
|
||||
var/static/list/gases_by_flag
|
||||
if(!gases_by_flag)
|
||||
gases_by_flag = list()
|
||||
if(!(flag in gases_by_flag))
|
||||
gases_by_flag += flag
|
||||
gases_by_flag[flag] = list()
|
||||
for(var/g in flags)
|
||||
if(flags[g] & flag)
|
||||
gases_by_flag[flag] += g
|
||||
return gases_by_flag[flag]
|
||||
|
||||
GLOBAL_DATUM_INIT(gas_data, /datum/auxgm, new)
|
||||
|
||||
@@ -156,7 +186,6 @@ GLOBAL_DATUM_INIT(gas_data, /datum/auxgm, new)
|
||||
appearance_flags = TILE_BOUND
|
||||
vis_flags = NONE
|
||||
|
||||
/obj/effect/overlay/gas/New(state, alph)
|
||||
/obj/effect/overlay/gas/New(state)
|
||||
. = ..()
|
||||
icon_state = state
|
||||
alpha = alph
|
||||
|
||||
@@ -135,6 +135,7 @@ we use a hook instead
|
||||
/datum/gas_mixture/proc/set_temperature(new_temp)
|
||||
/datum/gas_mixture/proc/set_volume(new_volume)
|
||||
/datum/gas_mixture/proc/get_moles(gas_type)
|
||||
/datum/gas_mixture/proc/get_by_flag(flag)
|
||||
/datum/gas_mixture/proc/set_moles(gas_type, moles)
|
||||
|
||||
// VV WRAPPERS - EXTOOLS HOOKED PROCS DO NOT TAKE ARGUMENTS FROM CALL() FOR SOME REASON.
|
||||
@@ -152,13 +153,20 @@ we use a hook instead
|
||||
/datum/gas_mixture/proc/scrub_into(datum/gas_mixture/target, ratio, list/gases)
|
||||
/datum/gas_mixture/proc/mark_immutable()
|
||||
/datum/gas_mixture/proc/get_gases()
|
||||
/datum/gas_mixture/proc/add(amt)
|
||||
/datum/gas_mixture/proc/subtract(amt)
|
||||
/datum/gas_mixture/proc/multiply(factor)
|
||||
/datum/gas_mixture/proc/divide(factor)
|
||||
/datum/gas_mixture/proc/get_last_share()
|
||||
/datum/gas_mixture/proc/clear()
|
||||
|
||||
/datum/gas_mixture/proc/adjust_moles(gas_type, amt = 0)
|
||||
set_moles(gas_type, clamp(get_moles(gas_type) + amt,0,INFINITY))
|
||||
|
||||
/datum/gas_mixture/proc/adjust_moles_temp(gas_type, amt, temperature)
|
||||
|
||||
/datum/gas_mixture/proc/adjust_multi()
|
||||
|
||||
/datum/gas_mixture/proc/return_volume() //liters
|
||||
|
||||
/datum/gas_mixture/proc/thermal_energy() //joules
|
||||
@@ -175,6 +183,10 @@ we use a hook instead
|
||||
//Removes amount of gas from the gas_mixture
|
||||
//Returns: gas_mixture with the gases removed
|
||||
|
||||
/datum/gas_mixture/proc/remove_by_flag(flag, amount)
|
||||
//Removes amount of gas from the gas mixture by flag
|
||||
//Returns: gas_mixture with gases that match the flag removed
|
||||
|
||||
/datum/gas_mixture/proc/transfer_to(datum/gas_mixture/target, amount)
|
||||
//Transfers amount of gas to target. Equivalent to target.merge(remove(amount)) but faster.
|
||||
|
||||
@@ -235,6 +247,14 @@ we use a hook instead
|
||||
//Makes every gas in the given list have the same pressure, temperature and gas proportions.
|
||||
//Returns: null
|
||||
|
||||
/datum/gas_mixture/proc/__remove_by_flag()
|
||||
|
||||
/datum/gas_mixture/remove_by_flag(flag, amount)
|
||||
var/datum/gas_mixture/removed = new type
|
||||
__remove_by_flag(removed, flag, amount)
|
||||
|
||||
return removed
|
||||
|
||||
/datum/gas_mixture/proc/__remove()
|
||||
/datum/gas_mixture/remove(amount)
|
||||
var/datum/gas_mixture/removed = new type
|
||||
|
||||
@@ -5,10 +5,9 @@
|
||||
|
||||
for(var/r in subtypesof(/datum/gas_reaction))
|
||||
var/datum/gas_reaction/reaction = r
|
||||
if(initial(reaction.exclude))
|
||||
continue
|
||||
reaction = new r
|
||||
. += reaction
|
||||
if(!reaction.exclude)
|
||||
. += reaction
|
||||
sortTim(., /proc/cmp_gas_reaction)
|
||||
|
||||
/proc/cmp_gas_reaction(datum/gas_reaction/a, datum/gas_reaction/b) // compares lists of reactions by the maximum priority contained within the list
|
||||
@@ -18,7 +17,6 @@
|
||||
//regarding the requirements lists: the minimum or maximum requirements must be non-zero.
|
||||
//when in doubt, use MINIMUM_MOLE_COUNT.
|
||||
var/list/min_requirements
|
||||
var/list/max_requirements
|
||||
var/exclude = FALSE //do it this way to allow for addition/removal of reactions midmatch in the future
|
||||
var/priority = 100 //lower numbers are checked/react later than higher numbers. if two reactions have the same priority they may happen in either order
|
||||
var/name = "reaction"
|
||||
@@ -716,3 +714,78 @@
|
||||
if(result != NO_REACTION)
|
||||
return list("success" = FALSE, "message" = "Miasma sterilization not stopping due to water vapor correctly!")
|
||||
return ..()
|
||||
|
||||
/datum/gas_reaction/nitric_oxide
|
||||
priority = -5
|
||||
name = "Nitric oxide decomposition"
|
||||
id = "nitric_oxide"
|
||||
|
||||
/datum/gas_reaction/nitric_oxide/init_reqs()
|
||||
min_requirements = list(
|
||||
"MAX_TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST+100,
|
||||
GAS_NITRIC = MINIMUM_MOLE_COUNT
|
||||
)
|
||||
|
||||
/datum/gas_reaction/nitric_oxide/react(datum/gas_mixture/air, datum/holder)
|
||||
var/nitric = air.get_moles(GAS_NITRIC)
|
||||
var/oxygen = air.get_moles(GAS_O2)
|
||||
var/max_amount = max(nitric / 10, MINIMUM_MOLE_COUNT)
|
||||
var/enthalpy = air.return_temperature() * (air.heat_capacity() + R_IDEAL_GAS_EQUATION * air.total_moles());
|
||||
var/list/enthalpies = GLOB.gas_data.enthalpies
|
||||
if(oxygen > MINIMUM_MOLE_COUNT)
|
||||
var/reaction_amount = min(max_amount, oxygen)
|
||||
air.adjust_moles(GAS_NITRIC, -reaction_amount*2)
|
||||
air.adjust_moles(GAS_O2, -reaction_amount)
|
||||
air.adjust_moles(GAS_NITRYL, reaction_amount*2)
|
||||
enthalpy += (reaction_amount * -(enthalpies[GAS_NITRIC] - enthalpies[GAS_NITRYL]))
|
||||
air.adjust_moles(GAS_NITRIC, -max_amount)
|
||||
air.adjust_moles(GAS_O2, max_amount * 0.5)
|
||||
air.adjust_moles(GAS_N2, max_amount * 0.5)
|
||||
enthalpy += max_amount * -enthalpies[GAS_NITRIC]
|
||||
air.set_temperature(enthalpy/(air.heat_capacity() + R_IDEAL_GAS_EQUATION * air.total_moles()))
|
||||
return REACTING
|
||||
|
||||
/datum/gas_reaction/hagedorn
|
||||
priority = -INFINITY
|
||||
name = "Hagedorn decomposition"
|
||||
id = "hagedorn"
|
||||
|
||||
/datum/gas_reaction/hagedorn/init_reqs()
|
||||
min_requirements = list(
|
||||
"TEMP" = 2e12 // 2 trillion kelvins
|
||||
)
|
||||
|
||||
/datum/gas_reaction/hagedorn/react(datum/gas_mixture/air, datum/holder)
|
||||
var/initial_energy = air.thermal_energy()
|
||||
for(var/g in air.get_gases())
|
||||
air.set_moles(g, 0)
|
||||
air.set_moles(GAS_QCD, initial_energy / (air.return_temperature() * GLOB.gas_data.specific_heats[GAS_QCD]))
|
||||
|
||||
/datum/gas_reaction/dehagedorn
|
||||
priority = 50
|
||||
name = "Hagedorn condensation"
|
||||
id = "dehagedorn"
|
||||
|
||||
/datum/gas_reaction/dehagedorn/init_reqs()
|
||||
min_requirements = list(
|
||||
"MAX_TEMP" = 1.99e12,
|
||||
GAS_QCD = MINIMUM_MOLE_COUNT
|
||||
)
|
||||
|
||||
/datum/gas_reaction/dehagedorn/react(datum/gas_mixture/air, datum/holder)
|
||||
var/initial_energy = air.thermal_energy()
|
||||
var/energy_remaining = initial_energy
|
||||
air.set_moles(GAS_QCD, 0)
|
||||
air.set_temperature(min(air.return_temperature(), 1.8e12))
|
||||
var/new_temp = air.return_temperature()
|
||||
var/list/gases = GLOB.gas_data.specific_heats.Copy()
|
||||
gases -= GAS_QCD
|
||||
gases -= GAS_TRITIUM // no refusing sorry
|
||||
for(var/g in gases)
|
||||
gases[g] = 10000 / gases[g]
|
||||
while(energy_remaining > 0)
|
||||
var/G = pick(gases)
|
||||
air.adjust_moles(G, max(0.1, energy_remaining / (gases[G] * new_temp * 20)))
|
||||
energy_remaining = initial_energy - air.thermal_energy()
|
||||
air.adjust_heat(-energy_remaining)
|
||||
return REACTING
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user