Tg 2 11 sync (#215)

* first series of updates

* datums

* games folder

* admin and atmosia stuffs

* moar

* mob updates borg riding

* sprites and stuff

* fixes for various things

* oops. some missed fixes
This commit is contained in:
Poojawa
2017-02-12 03:56:14 -06:00
committed by GitHub
parent 30b3dff395
commit 6674f9fc15
153 changed files with 1651 additions and 1368 deletions
+18 -14
View File
@@ -41,11 +41,26 @@
if(luminosity)
light = new(src)
var/initialized = SSobj.initialized
if(initialized > INITIALIZATION_INSSOBJ)
Initialize(initialized == INITIALIZATION_INNEW_MAPLOAD)
var/do_initialize = SSobj.initialized
if(do_initialize > INITIALIZATION_INSSOBJ)
Initialize(do_initialize == INITIALIZATION_INNEW_MAPLOAD)
//. = ..() //uncomment if you are dumb enough to add a /datum/New() proc
//Called after New if the map is being loaded. mapload = TRUE
//Called from base of New if the map is being loaded. mapload = FALSE
//This base must be called or derivatives must set initialized to TRUE to prevent repeat calls
//Derivatives must not sleep
//Returning TRUE while mapload is TRUE will cause the object to be initialized again with mapload = FALSE when everything else is done
//(Useful for things that requires turfs to have air). This base may only be called once, however
//Note: the following functions don't call the base for optimization and must copypasta:
// /turf/Initialize
// /turf/open/space/Initialize
/atom/proc/Initialize(mapload)
if(initialized)
stack_trace("Warning: [src]([type]) initialized multiple times!")
initialized = TRUE
/atom/Destroy()
if(alternate_appearances)
for(var/aakey in alternate_appearances)
@@ -435,17 +450,6 @@ var/list/blood_splatter_icons = list()
sleep(1)
stoplag()
//Called after New if the world is not loaded with TRUE
//Called from base of New if the world is loaded with FALSE
//This base must be called or derivatives must set initialized to TRUE to prevent repeat calls
//Derivatives must not sleep
/atom/proc/Initialize(mapload)
#ifdef TESTING
if(initialized)
stack_trace("Warning: [src]([type]) initialized multiple times!")
#endif
initialized = TRUE
//the vision impairment to give to the mob whose perspective is set to that atom (e.g. an unfocused camera giving you an impaired vision when looking through it)
/atom/proc/get_remote_view_fullscreens(mob/user)
return
+4 -6
View File
@@ -2,7 +2,7 @@
layer = OBJ_LAYER
var/last_move = null
var/anchored = 0
var/throwing = 0
var/datum/thrownthing/throwing = null
var/throw_speed = 2 //How many tiles to move per ds when being thrown. Float values are fully supported
var/throw_range = 7
var/mob/pulledby = null
@@ -130,14 +130,12 @@
/atom/movable/Bump(atom/A, yes) //the "yes" arg is to differentiate our Bump proc from byond's, without it every Bump() call would become a double Bump().
if((A && yes))
if(throwing)
throwing = 0
throw_impact(A)
throwing.hit_atom(A)
. = 1
if(!A || QDELETED(A))
return
A.Bumped(src)
/atom/movable/proc/forceMove(atom/destination)
if(destination)
if(pulledby)
@@ -222,7 +220,7 @@
/atom/movable/proc/checkpass(passflag)
return pass_flags&passflag
/atom/movable/proc/throw_impact(atom/hit_atom)
/atom/movable/proc/throw_impact(atom/hit_atom, throwingdatum)
return hit_atom.hitby(src)
/atom/movable/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked)
@@ -297,7 +295,7 @@
if(pulledby)
pulledby.stop_pulling()
throwing = 1
throwing = TT
if(spin)
SpinAnimation(5, 1)
@@ -22,6 +22,7 @@
E.sight_flags -= SEE_MOBS
E.flash_protect = 2
user << "We adjust our eyes to protect them from bright lights."
user.update_sight()
else
user << "We can't adjust our eyes if we don't have any!"
@@ -150,7 +150,7 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "arm_blade"
item_state = "arm_blade"
flags = ABSTRACT | NODROP
flags = ABSTRACT | NODROP | DROPDEL
w_class = WEIGHT_CLASS_HUGE
force = 25
throwforce = 0 //Just to be on the safe side
@@ -203,7 +203,6 @@
..()
if(can_drop)
new /obj/item/weapon/melee/synthetic_arm_blade(get_turf(user))
qdel(src)
/***************************************\
|***********COMBAT TENTACLES*************|
@@ -303,11 +302,10 @@
for(var/obj/item/I in H.held_items)
if(I.is_sharp())
C.visible_message("<span class='danger'>[H] impales [C] with [H.p_their()] [I.name]!</span>", "<span class='userdanger'>[H] impales you with [H.p_their()] [I.name]!</span>")
C.apply_damage(I.force*2, BRUTE, "chest")
C.apply_damage(I.force, BRUTE, "chest")
H.do_item_attack_animation(C, used_item = I)
H.add_mob_blood(C)
playsound(get_turf(H),I.hitsound,75,1)
C.Weaken(4)
return
/obj/item/projectile/tentacle/on_hit(atom/target, blocked = 0)
@@ -355,7 +353,6 @@
if(INTENT_HARM)
C.visible_message("<span class='danger'>[L] is thrown towards [H] by a tentacle!</span>","<span class='userdanger'>A tentacle grabs you and throws you towards [H]!</span>")
C.Weaken(3)
C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(src, .proc/tentacle_stab, H, C))
return 1
else
+8 -39
View File
@@ -84,8 +84,6 @@ Credit where due:
/datum/game_mode
var/list/servants_of_ratvar = list() //The Enlightened servants of Ratvar
var/required_escapees = 0 //How many servants need to escape, if applicable
var/required_silicon_converts = 0 //How many robotic lifeforms need to be converted, if applicable
var/clockwork_objective = CLOCKCULT_GATEWAY //The objective that the servants must fulfill
var/clockwork_explanation = "Construct a Gateway to the Celestial Derelict and free Ratvar." //The description of the current objective
@@ -141,20 +139,12 @@ Credit where due:
/datum/game_mode/clockwork_cult/proc/forge_clock_objectives() //Determine what objective that Ratvar's servants will fulfill
var/list/possible_objectives = list(CLOCKCULT_ESCAPE, CLOCKCULT_GATEWAY)
var/silicons_possible = FALSE
for(var/mob/living/silicon/ai/S in living_mob_list)
silicons_possible = TRUE
if(silicons_possible)
possible_objectives += CLOCKCULT_SILICONS
clockwork_objective = pick(possible_objectives)
switch(clockwork_objective)
if(CLOCKCULT_ESCAPE)
required_escapees = round(max(1, roundstart_player_count / 3)) //33% of the player count must be cultists
clockwork_explanation = "Ensure that [required_escapees] servants of Ratvar escape from [station_name()]."
clockwork_explanation = "Construct a Gateway to the Celestial Derelict and proselytize the entire station."
if(CLOCKCULT_GATEWAY)
clockwork_explanation = "Construct a Gateway to the Celestial Derelict and free Ratvar."
if(CLOCKCULT_SILICONS)
clockwork_explanation = "Ensure that all active silicon-based lifeforms on [station_name()] are servants of Ratvar and Application scripture is unlocked."
return 1
/datum/game_mode/clockwork_cult/proc/greet_servant(mob/M) //Description of their role
@@ -199,27 +189,8 @@ Credit where due:
/datum/game_mode/clockwork_cult/proc/check_clockwork_victory()
switch(clockwork_objective)
if(CLOCKCULT_ESCAPE)
var/surviving_servants = 0
for(var/datum/mind/M in servants_of_ratvar)
if(M.current && M.current.stat != DEAD && (M.current.onCentcom() || M.current.onSyndieBase()))
surviving_servants++
clockwork_explanation = "Ensure that [required_escapees] servant(s) of Ratvar escape from [station_name()].<br><i><b>[surviving_servants]</b> managed to escape!</i>"
if(surviving_servants >= required_escapees)
ticker.news_report = CULT_ESCAPE
return TRUE
if(CLOCKCULT_SILICONS)
var/total_silicons = 0
var/valid_silicons = 0
for(var/mob/living/silicon/S in mob_list) //Only check robots and AIs
if(isAI(S) || iscyborg(S))
total_silicons++
if(is_servant_of_ratvar(S) || S.stat == DEAD)
valid_silicons++
clockwork_explanation = "Ensure that all active silicon-based lifeforms on [station_name()] are servants of Ratvar and Application scripture is unlocked.<br>\
<i><b>[valid_silicons]/[total_silicons]</b> silicons were killed or converted!"
var/list/scripture_states = scripture_unlock_check()
if(valid_silicons >= total_silicons && scripture_states[SCRIPTURE_APPLICATION])
ticker.news_report = CLOCK_SILICONS
if(clockwork_gateway_activated)
ticker.news_report = CLOCK_PROSELYTIZATION
return TRUE
if(CLOCKCULT_GATEWAY)
if(ratvar_awakens)
@@ -241,18 +212,16 @@ Credit where due:
feedback_set_details("round_end_result", "win - servants completed their objective ([clockwork_objective])")
else
var/half_victory = FALSE
if(clockwork_objective == CLOCKCULT_GATEWAY)
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = locate() in all_clockwork_objects
if(G)
half_victory = TRUE
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = locate() in all_clockwork_objects
if(G)
half_victory = TRUE
if(half_victory)
text += "<span class='large_brass'><b>The crew escaped before Ratvar could rise, but the gateway was successfully constructed!</b></span>"
text += "<span class='large_brass'><b>The crew escaped before [clockwork_objective == CLOCKCULT_GATEWAY ? "Ratvar could rise":"the station could be proselytized"], but the gateway \
was successfully constructed!</b></span>"
feedback_set_details("round_end_result", "halfwin - round ended before the gateway finished")
else
text += "<span class='userdanger'>Ratvar's servants have failed!</span>"
feedback_set_details("round_end_result", "loss - servants failed their objective ([clockwork_objective])")
if(clockwork_gateway_activated && clockwork_objective != CLOCKCULT_GATEWAY)
ticker.news_report = CLOCK_PROSELYTIZATION
text += "<br><b>The servants' objective was:</b> <br>[clockwork_explanation]"
text += "<br>Ratvar's servants had <b>[clockwork_caches]</b> Tinkerer's Caches."
text += "<br><b>Construction Value(CV)</b> was: <b>[clockwork_construction_value]</b>"
@@ -159,11 +159,10 @@
/obj/effect/clockwork/sigil/submission/accession/post_channel(mob/living/L)
if(L.isloyal())
var/mob/living/carbon/C = L
delete_on_finish = TRUE
C.visible_message("<span class='warning'>[C] visibly trembles!</span>", \
L.visible_message("<span class='warning'>[L] visibly trembles!</span>", \
"<span class='sevtug'>[text2ratvar("You will be mine and his. This puny trinket will not stop me.")]</span>")
for(var/obj/item/weapon/implant/mindshield/M in C.implants)
for(var/obj/item/weapon/implant/mindshield/M in L.implants)
qdel(M)
@@ -159,7 +159,7 @@
/obj/item/stack/tile/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
if(source)
return FALSE
return list("operation_time" = amount, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_FLOOR), "spawn_dir" = SOUTH)
return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_FLOOR), "spawn_dir" = SOUTH)
//Airlock conversion
/obj/machinery/door/airlock/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
@@ -263,42 +263,18 @@
//Hitting a clockwork structure will try to repair it.
/obj/structure/destructible/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
. = TRUE
if(!can_be_repaired)
user << "<span class='warning'>[src] cannot be repaired!</span>"
return
if(obj_integrity >= max_integrity)
user << "<span class='warning'>[src] is at maximum integrity!</span>"
return
var/amount_to_heal = max_integrity - obj_integrity
var/healing_for_cycle = min(amount_to_heal, repair_amount)
var/power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
user << "<span class='warning'>You need at least <b>[power_required]W</b> power to start repairing [src], and at least \
<b>[round(amount_to_heal*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]W</b> to fully repair it!</span>"
var/list/repair_values = list()
if(!proselytizer.proselytizer_repair_checks(repair_values, src, user))
return
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] starts covering [src] in glowing orange energy...</span>", \
"<span class='alloy'>You start repairing [src]...</span>")
//hugeass while because we need to re-check after the do_after
proselytizer.repairing = src
while(proselytizer && user && src && obj_integrity < max_integrity)
amount_to_heal = max_integrity - obj_integrity
if(amount_to_heal <= 0)
while(proselytizer && user && src)
if(!do_after(user, repair_values["healing_for_cycle"] * proselytizer.speed_multiplier, target = src, \
extra_checks = CALLBACK(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/proselytizer_repair_checks, repair_values, src, user, TRUE)))
break
healing_for_cycle = min(amount_to_heal, repair_amount)
power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)) || \
!do_after(user, healing_for_cycle * proselytizer.speed_multiplier, target = src) || \
!proselytizer || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
break
amount_to_heal = max_integrity - obj_integrity
if(amount_to_heal <= 0)
break
healing_for_cycle = min(amount_to_heal, repair_amount)
power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
break
obj_integrity = Clamp(obj_integrity + healing_for_cycle, 0, max_integrity)
proselytizer.modify_stored_power(-power_required)
obj_integrity = Clamp(obj_integrity + repair_values["healing_for_cycle"], 0, max_integrity)
proselytizer.modify_stored_power(-repair_values["power_required"])
playsound(src, 'sound/machines/click.ogg', 50, 1)
if(proselytizer)
@@ -309,42 +285,18 @@
//Proselytizer mob heal proc, to avoid as much copypaste as possible.
/mob/living/proc/proselytizer_heal(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
if(!is_servant_of_ratvar(src))
user << "<span class='warning'>[src] does not serve Ratvar!</span>"
return FALSE
if(health >= maxHealth || (flags & GODMODE))
user << "<span class='warning'>[src == user ? "You" : "[src]"] [src == user ? "are" : "is"] at maximum health!</span>"
return FALSE
var/amount_to_heal = maxHealth - health
var/healing_for_cycle = min(amount_to_heal, 4)
var/power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
user << "<span class='warning'>You need at least <b>[power_required]W</b> power to start repairing[src == user ? " yourself" : " [src]"], and at least \
<b>[round(amount_to_heal*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]W</b> to fully repair [src == user ? "yourself" : "[p_them()]"]!</span>"
return FALSE
var/list/repair_values = list()
if(!proselytizer.proselytizer_repair_checks(repair_values, src, user))
return
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...</span>", \
"<span class='alloy'>You start repairin[src == user ? "g yourself" : "g [src]"]...</span>")
//hugeass while because we need to re-check after the do_after
proselytizer.repairing = src
while(proselytizer && user && src && health < maxHealth)
amount_to_heal = maxHealth - health
if(amount_to_heal <= 0)
while(proselytizer && user && src)
if(!do_after(user, repair_values["healing_for_cycle"] * proselytizer.speed_multiplier, target = src, \
extra_checks = CALLBACK(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/proselytizer_repair_checks, repair_values, src, user, TRUE)))
break
healing_for_cycle = min(amount_to_heal, 4)
power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)) || \
!do_after(user, healing_for_cycle * proselytizer.speed_multiplier, target = src) || \
!proselytizer || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
break
amount_to_heal = maxHealth - health
if(amount_to_heal <= 0)
break
healing_for_cycle = min(amount_to_heal, 4)
power_required = round(healing_for_cycle*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
if(!healing_for_cycle || (!proselytizer.can_use_power(RATVAR_POWER_CHECK) && !proselytizer.can_use_power(power_required)))
break
proselytizer_heal_tick(healing_for_cycle)
proselytizer.modify_stored_power(-power_required)
proselytizer_heal_tick(repair_values["healing_for_cycle"])
proselytizer.modify_stored_power(-repair_values["power_required"])
playsound(src, 'sound/machines/click.ogg', 50, 1)
if(proselytizer)
@@ -382,14 +334,17 @@
if(health < maxHealth && !(flags & GODMODE))
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...</span>", \
"<span class='alloy'>You start repairin[src == user ? "g yourself" : "g [src]"]...</span>")
proselytizer.repairing = src
if(do_after(user,80*proselytizer.speed_multiplier, target=src))
adjustHealth(-maxHealth)
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.</span>", \
"<span class='alloy'>You finish repairin[src == user ? "g yourself" : "g [src]"].</span>")
if(proselytizer)
proselytizer.repairing = null
else
user << "<span class='warning'>[src == user ? "You" : "[src]"] [src == user ? "are" : "is"] at maximum health!</span>"
//Convert shards and replicant alloy directly to power
//Convert shards and gear bits directly to power
/obj/item/clockwork/alloy_shards/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -POWER_STANDARD, "spawn_dir" = SOUTH)
@@ -404,6 +359,3 @@
/obj/item/clockwork/alloy_shards/small/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(CLOCKCULT_POWER_UNIT*0.02), "spawn_dir" = SOUTH)
/obj/item/clockwork/component/replicant_alloy/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -CLOCKCULT_POWER_UNIT, "spawn_dir" = SOUTH)
@@ -196,22 +196,17 @@
if(proselytize_values["power_cost"] > 0)
proselytize_values["power_cost"] *= 2
if(!can_use_power(proselytize_values["power_cost"]))
if(stored_power - proselytize_values["power_cost"] < 0)
user << "<span class='warning'>You need <b>[proselytize_values["power_cost"]]W</b> power to proselytize [target]!</span>"
else if(stored_power - proselytize_values["power_cost"] > max_power)
user << "<span class='warning'>Your [name] contains too much power to proselytize [target]!</span>"
var/target_type = target.type
if(!proselytize_checks(proselytize_values, target, target_type, user))
return FALSE
proselytize_values["operation_time"] *= speed_multiplier
playsound(target, 'sound/machines/click.ogg', 50, 1)
if(proselytize_values["operation_time"])
var/target_type = target.type
user.visible_message("<span class='warning'>[user]'s [name] begins tearing apart [target]!</span>", "<span class='brass'>You begin proselytizing [target]...</span>")
if(!do_after(user, proselytize_values["operation_time"], target = target))
return FALSE
if(repairing || !can_use_power(proselytize_values["power_cost"]) || !target || target.type != target_type) //Check again to prevent bypassing via spamclick
if(!do_after(user, proselytize_values["operation_time"], target = target, extra_checks = CALLBACK(src, .proc/proselytize_checks, proselytize_values, target, target_type, user, TRUE)))
return FALSE
user.visible_message("<span class='warning'>[user]'s [name] covers [target] in golden energy!</span>", "<span class='brass'>You proselytize [target].</span>")
else
@@ -234,3 +229,64 @@
if(no_table_check)
return TRUE
return FALSE
/obj/item/clockwork/clockwork_proselytizer/proc/proselytize_checks(list/proselytize_values, atom/target, expected_type, mob/user, silent) //checked constantly while proselytizing
if(!islist(proselytize_values) || !target || QDELETED(target) || !user)
return FALSE
if(repairing)
return FALSE
if(target.type != expected_type)
return FALSE
if(can_use_power(RATVAR_POWER_CHECK))
proselytize_values["power_cost"] = 0
if(!can_use_power(proselytize_values["power_cost"]))
if(stored_power - proselytize_values["power_cost"] < 0)
if(!silent)
user << "<span class='warning'>You need <b>[proselytize_values["power_cost"]]W</b> power to proselytize [target]!</span>"
else if(stored_power - proselytize_values["power_cost"] > max_power)
if(!silent)
user << "<span class='warning'>Your [name] contains too much power to proselytize [target]!</span>"
return FALSE
return TRUE
//The repair check proc.
//Is dark magic. Can probably kill you.
/obj/item/clockwork/clockwork_proselytizer/proc/proselytizer_repair_checks(list/repair_values, atom/target, mob/user, silent) //Exists entirely to avoid an otherwise unreadable series of checks.
if(!islist(repair_values) || !target || QDELETED(target) || !user)
return FALSE
if(isliving(target))
var/mob/living/L = target
if(!is_servant_of_ratvar(L))
if(!silent)
user << "<span class='warning'>[L] does not serve Ratvar!</span>"
return FALSE
if(L.health >= L.maxHealth || (L.flags & GODMODE))
if(!silent)
user << "<span class='warning'>[L == user ? "You are" : "[L] is"] at maximum health!</span>"
return FALSE
repair_values["amount_to_heal"] = L.maxHealth - L.health
else if(isobj(target))
if(istype(target, /obj/structure/destructible/clockwork))
var/obj/structure/destructible/clockwork/C = target
if(!C.can_be_repaired)
if(!silent)
user << "<span class='warning'>[C] cannot be repaired!</span>"
return FALSE
var/obj/O = target
if(O.obj_integrity >= O.max_integrity)
if(!silent)
user << "<span class='warning'>[O] is at maximum integrity!</span>"
return FALSE
repair_values["amount_to_heal"] = O.max_integrity - O.obj_integrity
else
return FALSE
if(repair_values["amount_to_heal"] <= 0)
return FALSE
repair_values["healing_for_cycle"] = min(repair_values["amount_to_heal"], PROSELYTIZER_REPAIR_PER_TICK)
repair_values["power_required"] = round(repair_values["healing_for_cycle"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
if(!can_use_power(RATVAR_POWER_CHECK) && !can_use_power(repair_values["power_required"]))
if(!silent)
user << "<span class='warning'>You need at least <b>[repair_values["power_required"]]W</b> power to start repairin[target == user ? "g yourself" : "g [target]"], and at least \
<b>[round(repair_values["amount_to_heal"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]W</b> to fully repair [target == user ? "yourself" : "[target.p_them()]"]!</span>"
return FALSE
return TRUE
@@ -179,7 +179,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
if(!channel_time)
return TRUE
for(var/invocation in invocations)
if(!check_special_requirements() || !do_after(invoker, channel_time / invocations.len, target = invoker) || !check_special_requirements())
if(!do_after(invoker, channel_time / invocations.len, target = invoker, extra_checks = CALLBACK(src, .proc/check_special_requirements)))
slab.busy = null
return FALSE
if(multiple_invokers_used)
@@ -206,9 +206,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
/datum/clockwork_scripture/channeled/scripture_effects()
for(var/i in 1 to chant_amount)
if(!can_recite())
break
if(!do_after(invoker, chant_interval, target = invoker))
if(!do_after(invoker, chant_interval, target = invoker, extra_checks = CALLBACK(src, .proc/can_recite)))
break
clockwork_say(invoker, text2ratvar(pick(chant_invocations)), whispered)
if(!chant_effects(i))
@@ -3,7 +3,7 @@
///////////////
//Ark of the Clockwork Justiciar: Creates a Gateway to the Celestial Derelict, either summoning ratvar or proselytizing everything.
/datum/clockwork_scripture/ark_of_the_clockwork_justiciar
/datum/clockwork_scripture/create_object/ark_of_the_clockwork_justiciar
descname = "Structure, Win Condition"
name = "Ark of the Clockwork Justiciar"
desc = "Tears apart a rift in spacetime to Reebe, the Celestial Derelict.\n\
@@ -15,19 +15,21 @@
consumed_components = list(BELLIGERENT_EYE = 10, VANGUARD_COGWHEEL = 10, GEIS_CAPACITOR = 10, REPLICANT_ALLOY = 10, HIEROPHANT_ANSIBLE = 10)
invokers_required = 5
multiple_invokers_used = TRUE
object_path = /obj/structure/destructible/clockwork/massive/celestial_gateway
creator_message = null
usage_tip = "The gateway is completely vulnerable to attack during its five-minute duration. It will periodically give indication of its general position to everyone on the station \
as well as being loud enough to be heard throughout the entire sector. Defend it with your life!"
tier = SCRIPTURE_JUDGEMENT
sort_priority = 1
/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/New()
/datum/clockwork_scripture/create_object/ark_of_the_clockwork_justiciar/New()
if(ticker && ticker.mode && ticker.mode.clockwork_objective != CLOCKCULT_GATEWAY)
invocations = list("ARMORER! FRIGHT! AMPERAGE! VANGUARD! I CALL UPON YOU!!", \
"THIS STATION WILL BE A BEACON OF HOPE IN THE DARKNESS OF SPACE!!", \
"HELP US MAKE THIS SHOW ENGINE'S GLORY!!")
..()
/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/check_special_requirements()
/datum/clockwork_scripture/create_object/ark_of_the_clockwork_justiciar/check_special_requirements()
if(!slab.no_cost)
if(ratvar_awakens)
invoker << "<span class='big_brass'>\"I am already here, idiot.\"</span>"
@@ -47,11 +49,4 @@
else
invoker << "<span class='warning'>Ratvar's recent banishment renders him too weak to be wrung forth from Reebe!</span>"
return FALSE
return TRUE
/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/scripture_effects()
var/turf/T = get_turf(invoker)
if(T)
new/obj/structure/destructible/clockwork/massive/celestial_gateway(T)
return TRUE
return FALSE
return ..()
@@ -9,8 +9,7 @@
anchored = 1
density = 1
resistance_flags = FIRE_PROOF | ACID_PROOF
var/repair_amount = 4 //how much a proselytizer can repair each cycle
var/can_be_repaired = TRUE //if a proselytizer can repair it at all
var/can_be_repaired = TRUE //if a proselytizer can repair it
break_message = "<span class='warning'>The frog isn't a meme after all!</span>" //The message shown when a structure breaks
break_sound = 'sound/magic/clockwork/anima_fragment_death.ogg' //The sound played when a structure breaks
debris = list(/obj/item/clockwork/alloy_shards/large = 1, \
@@ -72,9 +71,10 @@
. *= min(max_integrity/max(obj_integrity, 1), 4)
. = round(., 0.01)
/obj/structure/destructible/clockwork/can_be_unfasten_wrench(mob/user)
/obj/structure/destructible/clockwork/can_be_unfasten_wrench(mob/user, silent)
if(anchored && obj_integrity <= round(max_integrity * 0.25, 1))
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
if(!silent)
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
return FAILED_UNFASTEN
return ..()
@@ -158,9 +158,10 @@
var/powered = total_accessable_power()
return powered == PROCESS_KILL ? 25 : powered //make sure we don't accidentally return the arbitrary PROCESS_KILL define
/obj/structure/destructible/clockwork/powered/can_be_unfasten_wrench(mob/user)
/obj/structure/destructible/clockwork/powered/can_be_unfasten_wrench(mob/user, silent)
if(active)
user << "<span class='warning'>[src] needs to be disabled before it can be unsecured!</span>"
if(!silent)
user << "<span class='warning'>[src] needs to be disabled before it can be unsecured!</span>"
return FAILED_UNFASTEN
return ..()
@@ -74,8 +74,6 @@
hierophant_message("<span class='large_brass'><b>A gateway to the Celestial Derelict has been created in [gate_area.map_name]!</b></span>", FALSE, src)
if(!objective_is_gateway)
ratvar_portal = FALSE
hierophant_message("<span class='big_brass'>This newly constructed gateway will not free Ratvar, \
and will instead simply proselytize and convert everything and everyone on the station.</span>", TRUE)
SSshuttle.registerHostileEnvironment(src)
START_PROCESSING(SSprocessing, src)
@@ -210,13 +208,14 @@
animate(glow, transform = matrix() * 3, alpha = 0, time = 5)
var/turf/startpoint = get_turf(src)
QDEL_IN(src, 3)
clockwork_gateway_activated = TRUE
if(ratvar_portal)
sleep(3)
clockwork_gateway_activated = TRUE
new/obj/structure/destructible/clockwork/massive/ratvar(startpoint)
else
INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency.proc/request, null, 0) //call the shuttle immediately
sleep(3)
clockwork_gateway_activated = TRUE
send_to_playing_players("<span class='ratvar'>\"[text2ratvar("Behold")]!\"</span>\n<span class='inathneq_large'>\"[text2ratvar("See Engine's mercy")]!\"</span>\n\
<span class='sevtug_large'>\"[text2ratvar("Observe Engine's design skills")]!\"</span>\n<span class='nezbere_large'>\"[text2ratvar("Behold Engine's light")]!!\"</span>\n\
<span class='nzcrentr_large'>\"[text2ratvar("Gaze upon Engine's power")]!\"</span>")
@@ -234,13 +233,8 @@
dist = FALSE
T.ratvar_act(dist)
CHECK_TICK
for(var/mob/living/silicon/robot/R in silicon_mobs)
if(R && R.stat != DEAD && !is_servant_of_ratvar(R))
add_servant_of_ratvar(R)
for(var/i in ai_list)
var/mob/living/silicon/ai/A = i
if(A && A.stat != DEAD && !is_servant_of_ratvar(A))
add_servant_of_ratvar(A)
for(var/mob/living/L in living_mob_list)
L.ratvar_act()
for(var/I in all_clockwork_mobs)
var/mob/M = I
if(M.stat == CONSCIOUS)
@@ -25,9 +25,10 @@
if(is_servant_of_ratvar(user) || isobserver(user))
user << "<span class='nzcrentr_small'>It requires <b>[hierophant_cost]W</b> to broadcast over the Hierophant Network, and <b>[gateway_cost]W</b> to open a Spatial Gateway.</span>"
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/can_be_unfasten_wrench(mob/user)
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/can_be_unfasten_wrench(mob/user, silent)
if(active)
user << "<span class='warning'>[src] is currently sustaining a gateway!</span>"
if(!silent)
user << "<span class='warning'>[src] is currently sustaining a gateway!</span>"
return FAILED_UNFASTEN
return ..()
@@ -32,14 +32,16 @@
/obj/structure/destructible/clockwork/ocular_warden/hulk_damage()
return 25
/obj/structure/destructible/clockwork/ocular_warden/can_be_unfasten_wrench(mob/user)
/obj/structure/destructible/clockwork/ocular_warden/can_be_unfasten_wrench(mob/user, silent)
if(anchored)
if(obj_integrity <= max_integrity * 0.25)
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
if(!silent)
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
return FAILED_UNFASTEN
else
for(var/obj/structure/destructible/clockwork/ocular_warden/W in orange(3, src))
user << "<span class='neovgre'>You sense another ocular warden too near this location. Activating this one this close would cause them to fight.</span>"
if(!silent)
user << "<span class='neovgre'>You sense another ocular warden too near this location. Activating this one this close would cause them to fight.</span>"
return FAILED_UNFASTEN
return SUCCESSFUL_UNFASTEN
+1 -1
View File
@@ -498,9 +498,9 @@ var/list/teleport_runes = list()
sleep(40)
if(src)
color = "#FF0000"
new /obj/singularity/narsie/large(T) //Causes Nar-Sie to spawn even if the rune has been removed
if(cult_mode)
cult_mode.eldergod = 0
new /obj/singularity/narsie/large(T) //Causes Nar-Sie to spawn even if the rune has been removed
/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
if((istype(I, /obj/item/weapon/tome) && iscultist(user)))
@@ -196,9 +196,32 @@
/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
return S.Integrate(src)
/obj/item/proc/IntegrateAmount() //returns the amount of resources gained when eating this item
if(materials[MAT_METAL] || materials[MAT_GLASS])
return 1
return 0
/obj/item/weapon/gun/swarmer_act()//Stops you from eating the entire armory
return FALSE
/obj/item/clockwork/alloy_shards/IntegrateAmount()
return 10
/obj/item/stack/tile/brass/IntegrateAmount()
return 5
/obj/item/clockwork/alloy_shards/medium/gear_bit/large/IntegrateAmount()
return 4
/obj/item/clockwork/alloy_shards/large/IntegrateAmount()
return 3
/obj/item/clockwork/alloy_shards/medium/IntegrateAmount()
return 2
/obj/item/clockwork/alloy_shards/small/IntegrateAmount()
return 1
/turf/open/floor/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor
return FALSE
@@ -316,6 +339,10 @@
S << "<span class='warning'>This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.</span>"
return FALSE
/obj/machinery/deepfryer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>This kitchen appliance should be preserved, it will make delicious unhealthy snacks for our masters in the future. Aborting.</span>"
return FALSE
/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>"
return FALSE
@@ -362,6 +389,10 @@
S << "<span class='warning'>This object is receiving unactivated swarmer shells to help us. Aborting.</span>"
return FALSE
/obj/structure/destructible/clockwork/massive/celestial_gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>This object is multiplying existing resources. Aborting.</span>"
return FALSE
/obj/structure/lattice/catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
. = ..()
var/turf/here = get_turf(src)
@@ -373,13 +404,12 @@
/obj/item/device/unactivated_swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
if(S.resources + 50 > S.max_resources)
S << "<span class='warning'>We have too many resources to reconsume this shell. Aborting.</span>"
else
..()
S.resources += 49 //refund the whole thing
..()
return FALSE //would logically be TRUE, but we don't want AI swarmers eating player spawn chances.
/obj/item/device/unactivated_swarmer/IntegrateAmount()
return 50
/obj/machinery/hydroponics/soil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>This object does not contain enough materials to work with.</span>"
return FALSE
@@ -396,13 +426,13 @@
return 0
return new fabrication_object(loc)
/mob/living/simple_animal/hostile/swarmer/proc/Integrate(obj/item/target)
if(resources >= max_resources)
var/resource_gain = target.IntegrateAmount()
if(resources + resource_gain > max_resources)
src << "<span class='warning'>We cannot hold more materials!</span>"
return TRUE
if((target.materials[MAT_METAL]) || (target.materials[MAT_GLASS]))
resources++
if(resource_gain)
resources += resource_gain
do_attack_animation(target)
changeNext_move(CLICK_CD_MELEE)
var/obj/effect/overlay/temp/swarmer/integrate/I = new /obj/effect/overlay/temp/swarmer/integrate(get_turf(target))
@@ -57,6 +57,7 @@
U.hidden_uplink.telecrystals = CHALLENGE_TELECRYSTALS
U.hidden_uplink.set_gamemode(/datum/game_mode/nuclear)
config.shuttle_refuel_delay = max(config.shuttle_refuel_delay, CHALLENGE_SHUTTLE_DELAY)
feedback_set("nuclear_challenge_mode",1)
qdel(src)
/obj/item/device/nuclear_challenge/proc/check_allowed(mob/living/user)
+1 -1
View File
@@ -20,7 +20,7 @@ var/bomb_set
density = 1
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/timer_set = 60
var/timer_set = 90
var/default_timer_set = 90
var/minimum_timer_set = 90
var/maximum_timer_set = 3600
+1
View File
@@ -72,6 +72,7 @@
/obj/machinery/door/firedoor/attack_hand(mob/user)
if(operating || !density)
return
user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] bangs on \the [src].",
"You bang on \the [src].")
+1 -1
View File
@@ -96,7 +96,7 @@
return
var/area/A = get_area(src)
A.firealert(src)
playsound(src.loc, 'sound/ambience/signal.ogg', 75, 0)
playsound(src.loc, 'goon/sound/machinery/FireAlarm.ogg', 75, 0)
/obj/machinery/firealarm/proc/alarm_in(time)
addtimer(CALLBACK(src, .proc/alarm), time)
+10 -6
View File
@@ -356,13 +356,13 @@ Class Procs:
return 1
return 0
/obj/proc/can_be_unfasten_wrench(mob/user)
/obj/proc/can_be_unfasten_wrench(mob/user, silent) //if we can unwrench this object; returns SUCCESSFUL_UNFASTEN and FAILED_UNFASTEN, which are both TRUE, or CANT_UNFASTEN, which isn't.
if(!isfloorturf(loc) && !anchored)
user << "<span class='warning'>[src] needs to be on the floor to be secured!</span>"
return FAILED_UNFASTEN
return SUCCESSFUL_UNFASTEN
/obj/proc/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20)
/obj/proc/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20) //try to unwrench an object in a WONDERFUL DYNAMIC WAY
if(istype(W) && !(flags & NODECONSTRUCT))
var/can_be_unfasten = can_be_unfasten_wrench(user)
if(!can_be_unfasten || can_be_unfasten == FAILED_UNFASTEN)
@@ -372,10 +372,7 @@ Class Procs:
playsound(loc, W.usesound, 50, 1)
var/prev_anchored = anchored
//as long as we're the same anchored state and we're either on a floor or are anchored, toggle our anchored state
if(!time || (do_after(user, time*W.toolspeed, target = src) && anchored == prev_anchored))
can_be_unfasten = can_be_unfasten_wrench(user)
if(!can_be_unfasten || can_be_unfasten == FAILED_UNFASTEN)
return can_be_unfasten
if(!time || do_after(user, time*W.toolspeed, target = src, extra_checks = CALLBACK(src, .proc/unfasten_wrench_check, prev_anchored, user)))
user << "<span class='notice'>You [anchored ? "un" : ""]secure [src].</span>"
anchored = !anchored
playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
@@ -383,6 +380,13 @@ Class Procs:
return FAILED_UNFASTEN
return CANT_UNFASTEN
/obj/proc/unfasten_wrench_check(prev_anchored, mob/user) //for the do_after, this checks if unfastening conditions are still valid
if(anchored != prev_anchored)
return FALSE
if(can_be_unfasten_wrench(user, TRUE) != SUCCESSFUL_UNFASTEN) //if we aren't explicitly successful, cancel the fuck out
return FALSE
return TRUE
/obj/machinery/proc/exchange_parts(mob/user, obj/item/weapon/storage/part_replacer/W)
if(!istype(W))
return
+2
View File
@@ -123,6 +123,8 @@
switch(mode)
if(1,2,4,5)
user << "The display says:<br>\t<xmp>[message1]</xmp><br>\t<xmp>[message2]</xmp>"
if(mode == 1 && SSshuttle.emergency)
user << "Current Shuttle: [SSshuttle.emergency.name]"
/obj/machinery/status_display/proc/set_message(m1, m2)
+1 -1
View File
@@ -762,7 +762,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/machinery/vending/cigarette
name = "\improper ShadyCigs Deluxe"
desc = "If you want to get cancer, might as well do it in style"
desc = "If you want to get cancer, might as well do it in style."
product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!"
product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs."
icon_state = "cigs"
+41 -37
View File
@@ -358,8 +358,11 @@
occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 3)
else
occupant.clear_alert("mech damage")
if(occupant.loc != src) //something went wrong
var/actual_loc = occupant.loc
if(istype(actual_loc, /obj/item/device/mmi))
var/obj/item/device/mmi/M = actual_loc
actual_loc = M.mecha
if(actual_loc != src) //something went wrong
occupant.clear_alert("charge")
occupant.clear_alert("mech damage")
RemoveActions(occupant, human_occupant=1)
@@ -859,57 +862,58 @@
else
return 0
/obj/mecha/proc/mmi_move_inside(obj/item/device/mmi/mmi_as_oc,mob/user)
/obj/mecha/proc/mmi_move_inside(obj/item/device/mmi/mmi_as_oc, mob/user)
if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client)
user << "<span class='warning'>Consciousness matrix not detected!</span>"
return 0
return FALSE
else if(mmi_as_oc.brainmob.stat)
user << "<span class='warning'>Beta-rhythm below acceptable level!</span>"
return 0
return FALSE
else if(occupant)
user << "<span class='warning'>Occupant detected!</span>"
return 0
else if(dna_lock && (!mmi_as_oc.brainmob.stored_dna || dna_lock!=mmi_as_oc.brainmob.stored_dna.unique_enzymes))
return FALSE
else if(dna_lock && (!mmi_as_oc.brainmob.stored_dna || (dna_lock != mmi_as_oc.brainmob.stored_dna.unique_enzymes)))
user << "<span class='warning'>Access denied. [name] is secured with a DNA lock.</span>"
return 0
return FALSE
visible_message("<span class='notice'>[user] starts to insert an MMI into [name].</span>")
if(do_after(user, 40, target = src))
if(!occupant)
return mmi_moved_inside(mmi_as_oc,user)
return mmi_moved_inside(mmi_as_oc, user)
else
user << "<span class='warning'>Occupant detected!</span>"
else
user << "<span class='notice'>You stop inserting the MMI.</span>"
return 0
return FALSE
/obj/mecha/proc/mmi_moved_inside(obj/item/device/mmi/mmi_as_oc,mob/user)
if(mmi_as_oc && user in range(1))
if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client)
user << "<span class='notice'>Consciousness matrix not detected!</span>"
return 0
else if(mmi_as_oc.brainmob.stat)
user << "<span class='warning'>Beta-rhythm below acceptable level!</span>"
return 0
if(!user.transferItemToLoc(mmi_as_oc, src))
user << "<span class='warning'>\the [mmi_as_oc] is stuck to your hand, you cannot put it in \the [src]!</span>"
return
var/mob/brainmob = mmi_as_oc.brainmob
occupant = brainmob
brainmob.forceMove(src) //should allow relaymove
brainmob.reset_perspective(src)
brainmob.canmove = 1
mmi_as_oc.mecha = src
icon_state = initial(icon_state)
setDir(dir_in)
log_message("[mmi_as_oc] moved in as pilot.")
if(!internal_damage)
occupant << sound('sound/mecha/nominal.ogg',volume=50)
GrantActions(brainmob)
return 1
else
return 0
/obj/mecha/proc/mmi_moved_inside(obj/item/device/mmi/mmi_as_oc, mob/user)
if(!(Adjacent(mmi_as_oc) && Adjacent(user)))
return FALSE
if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client)
user << "<span class='notice'>Consciousness matrix not detected!</span>"
return FALSE
else if(mmi_as_oc.brainmob.stat)
user << "<span class='warning'>Beta-rhythm below acceptable level!</span>"
return FALSE
if(!user.transferItemToLoc(mmi_as_oc, src))
user << "<span class='warning'>\the [mmi_as_oc] is stuck to your hand, you cannot put it in \the [src]!</span>"
return FALSE
var/mob/brainmob = mmi_as_oc.brainmob
mmi_as_oc.mecha = src
occupant = brainmob
brainmob.forceMove(src) //should allow relaymove
brainmob.reset_perspective(src)
brainmob.remote_control = src
brainmob.update_canmove()
icon_state = initial(icon_state)
update_icon()
setDir(dir_in)
log_message("[mmi_as_oc] moved in as pilot.")
if(!internal_damage)
occupant << sound('sound/mecha/nominal.ogg',volume=50)
GrantActions(brainmob)
return TRUE
/obj/mecha/container_resist(mob/living/user)
go_out()
@@ -1046,4 +1050,4 @@ var/year_integer = text2num(year) // = 2013???
/obj/mecha/update_remote_sight(mob/living/user)
if(occupant_sight_flags)
if(user == occupant)
user.sight |= occupant_sight_flags
user.sight |= occupant_sight_flags
+1 -5
View File
@@ -43,10 +43,6 @@
..()
update_icon()
/obj/mecha/working/ripley/mmi_moved_inside(obj/item/device/mmi/mmi_as_oc,mob/user)
..()
update_icon()
/obj/mecha/working/ripley/update_icon()
..()
if (hides)
@@ -178,4 +174,4 @@
cargo -= O
else
if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded.
user << "<span class='warning'>You fail to push [O] out of [src]!</span>"
user << "<span class='warning'>You fail to push [O] out of [src]!</span>"
+15 -13
View File
@@ -104,9 +104,9 @@ list(name = "- Carbon Dioxide", desc = " This informational poster teaches the v
icon = 'icons/obj/contraband.dmi'
force = 0
resistance_flags = FLAMMABLE
var/serial_number = 0
var/serial = 0
var/obj/structure/sign/poster/resulting_poster = null //The poster that will be created is initialised and stored through contraband/poster's constructor
var/official = 0
var/rolled_official = 0
/obj/item/weapon/poster/contraband
@@ -118,20 +118,20 @@ list(name = "- Carbon Dioxide", desc = " This informational poster teaches the v
name = "motivational poster"
icon_state = "rolled_legit"
desc = "An official Nanotrasen-issued poster to foster a compliant and obedient workforce. It comes with state-of-the-art adhesive backing, for easy pinning to any vertical surface."
official = 1
rolled_official = 1
/obj/item/weapon/poster/New(turf/loc, given_serial = 0)
if(given_serial == 0)
if(!official)
serial_number = rand(1, NUM_OF_POSTER_DESIGNS)
resulting_poster = new(serial_number,official)
if(!rolled_official)
serial = rand(1, NUM_OF_POSTER_DESIGNS)
resulting_poster = new(serial,rolled_official)
else
serial_number = rand(1, NUM_OF_POSTER_DESIGNS_LEGIT)
resulting_poster = new(serial_number,official)
serial = rand(1, NUM_OF_POSTER_DESIGNS_LEGIT)
resulting_poster = new(serial,rolled_official)
else
serial_number = given_serial
serial = given_serial
//We don't give it a resulting_poster because if we called it with a given_serial it means that we're rerolling an already used poster.
name += " - No. [serial_number]"
name += " - No. [serial]"
..(loc)
@@ -182,8 +182,10 @@ list(name = "- Carbon Dioxide", desc = " This informational poster teaches the v
var/placespeed = 37 // don't change this, otherwise the animation will not sync to the progress bar
/obj/structure/sign/poster/New(serial,rolled_official)
serial_number = serial
official = rolled_official
if (!serial_number)
serial_number = serial
if(!official)
official = rolled_official
if(serial_number == loc)
if(!official)
serial_number = rand(1, NUM_OF_POSTER_DESIGNS) //This is for the mappers that want individual posters without having to use rolled posters.
@@ -259,7 +261,7 @@ list(name = "- Carbon Dioxide", desc = " This informational poster teaches the v
var/temp_loc = get_turf(user)
flick("poster_being_set",D)
D.loc = src
D.official = P.official
D.official = P.rolled_official
qdel(P) //delete it now to cut down on sanity checks afterwards. Agouri's code supports rerolling it anyway
playsound(D.loc, 'sound/items/poster_being_created.ogg', 100, 1)
+4 -2
View File
@@ -234,7 +234,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
var/obj/item/weapon/storage/S = loc
S.remove_from_storage(src, user.loc)
throwing = 0
if(throwing)
throwing.finalize(FALSE)
if(loc == user)
if(!user.dropItemToGround(src))
return
@@ -255,7 +256,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
var/obj/item/weapon/storage/S = loc
S.remove_from_storage(src, user.loc)
throwing = 0
if(throwing)
throwing.finalize(FALSE)
if(loc == user)
if(!user.dropItemToGround(src))
return
+5 -1
View File
@@ -1,3 +1,5 @@
#define STATION_RENAME_TIME_LIMIT 3000
/obj/item/station_charter
name = "station charter"
icon = 'icons/obj/wizard.dmi'
@@ -33,7 +35,7 @@
if(used)
user << "This charter has already been used to name the station."
return
if(!ignores_timeout && (world.time-round_start_time > CHALLENGE_TIME_LIMIT)) //5 minutes
if(!ignores_timeout && (world.time-round_start_time > STATION_RENAME_TIME_LIMIT)) //5 minutes
user << "The crew has already settled into the shift. \
It probably wouldn't be good to rename the station right now."
return
@@ -93,3 +95,5 @@
if(!unlimited_uses)
used = TRUE
#undef STATION_RENAME_TIME_LIMIT
@@ -7,7 +7,6 @@
w_class = WEIGHT_CLASS_TINY
origin_tech = "engineering=2;bluespace=1"
var/translate_binary = 0
var/translate_hive = 0
var/syndie = 0
var/centcom = 0
var/list/channels = list()
@@ -273,9 +273,6 @@
if(keyslot2.translate_binary)
src.translate_binary = 1
if(keyslot2.translate_hive)
src.translate_hive = 1
if(keyslot2.syndie)
src.syndie = 1
@@ -17,7 +17,6 @@
var/broadcasting = 0
var/listening = 1
var/translate_binary = 0
var/translate_hive = 0
var/freerange = 0 // 0 - Sanitize frequencies, 1 - Full range
var/list/channels = list() //see communications.dm for full list. First channes is a "default" for :h
var/obj/item/device/encryptionkey/keyslot //To allow the radio to accept encryption keys.
@@ -58,7 +57,6 @@
/obj/item/device/radio/proc/recalculateChannels()
channels = list()
translate_binary = 0
translate_hive = 0
syndie = 0
centcom = 0
@@ -72,9 +70,6 @@
if(keyslot.translate_binary)
translate_binary = 1
if(keyslot.translate_hive)
translate_hive = 1
if(keyslot.syndie)
syndie = 1
@@ -272,12 +272,17 @@
/obj/item/device/tape/attackby(obj/item/I, mob/user, params)
if(ruined && istype(I, /obj/item/weapon/screwdriver))
user << "<span class='notice'>You start winding the tape back in...</span>"
if(do_after(user, 120*I.toolspeed, target = src))
user << "<span class='notice'>You wound the tape back in.</span>"
fix()
if(ruined)
var/delay = -1
if (istype(I, /obj/item/weapon/screwdriver))
delay = 120*I.toolspeed
else if(istype(I, /obj/item/weapon/pen))
delay = 120*1.5
if (delay != -1)
user << "<span class='notice'>You start winding the tape back in...</span>"
if(do_after(user, delay, target = src))
user << "<span class='notice'>You wound the tape back in.</span>"
fix()
//Random colour tapes
/obj/item/device/tape/random/New()
+1 -1
View File
@@ -251,7 +251,7 @@
//get amount from user
var/min = 0
var/max = src.get_amount()
var/stackmaterial = input(user,"How many sheets do you wish to take out of this stack? (Maximum [max]") as num
var/stackmaterial = round(input(user,"How many sheets do you wish to take out of this stack? (Maximum [max]") as num)
if(stackmaterial == null || stackmaterial <= min || stackmaterial >= src.get_amount())
return
else
+20 -27
View File
@@ -522,43 +522,39 @@ var/global/list/RPD_recipes=list(
if(!user.IsAdvancedToolUser() || istype(A,/turf/open/space/transit))
return ..()
//make sure what we're clicking is valid for the current mode
var/is_paintable = (p_class == PAINT_MODE && istype(A, /obj/machinery/atmospherics/pipe))
var/is_consumable = (p_class == EATING_MODE && (istype(A, /obj/item/pipe) || istype(A, /obj/item/pipe_meter) || istype(A, /obj/structure/disposalconstruct)))
var/can_make_pipe = ((p_class == ATMOS_MODE || p_class == METER_MODE || p_class == DISPOSALS_MODE) && isturf(A))
if(!is_paintable && !is_consumable && !can_make_pipe)
return ..()
//So that changing the menu settings doesn't affect the pipes already being built.
var/queued_p_type = p_type
var/queued_p_dir = p_dir
var/queued_p_flipped = p_flipped
. = FALSE
switch(p_class)
if(PAINT_MODE) // Paint pipes
if(!istype(A,/obj/machinery/atmospherics/pipe))
// Avoid spewing errors about invalid mode -2 when clicking on stuff that aren't pipes.
user << "<span class='warning'>\The [src]'s error light flickers! Perhaps you need to only use it on pipes and pipe meters?</span>"
return
switch(p_class) //if we've gotten this var, the target is valid
if(PAINT_MODE) //Paint pipes
var/obj/machinery/atmospherics/pipe/P = A
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
P.add_atom_colour(paint_colors[paint_color], FIXED_COLOUR_PRIORITY)
P.pipe_color = paint_colors[paint_color]
user.visible_message("<span class='notice'>[user] paints \the [P] [paint_color].</span>","<span class='notice'>You paint \the [P] [paint_color].</span>")
//P.update_icon()
P.update_node_icon()
return
if(EATING_MODE) // Eating pipes
// Must click on an actual pipe or meter.
if(!(istype(A,/obj/item/pipe) || istype(A,/obj/item/pipe_meter) || istype(A,/obj/structure/disposalconstruct)))
// Avoid spewing errors about invalid mode -1 when clicking on stuff that aren't pipes.
user << "<span class='warning'>The [src]'s error light flickers! Perhaps you need to only use it on pipes and pipe meters?</span>"
return
user << "<span class='notice'>You start destroying pipe...</span>"
if(EATING_MODE) //Eating pipes
user << "<span class='notice'>You start destroying a pipe...</span>"
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 2, target = A))
activate()
qdel(A)
if(ATMOS_MODE)
if(!isturf(A))
user << "<span class='warning'>The [src]'s error light flickers!</span>"
return
user << "<span class='notice'>You start building pipes...</span>"
if(ATMOS_MODE) //Making pipes
user << "<span class='notice'>You start building a pipe...</span>"
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 2, target = A))
activate()
@@ -567,21 +563,18 @@ var/global/list/RPD_recipes=list(
P.update()
P.add_fingerprint(usr)
if(METER_MODE)
if(!isturf(A))
user << "<span class='warning'>The [src]'s error light flickers!</span>"
return 0
if(METER_MODE) //Making pipe meters
user << "<span class='notice'>You start building a meter...</span>"
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 2, target = A))
activate()
new /obj/item/pipe_meter(A)
if(DISPOSALS_MODE)
if(!isturf(A) || is_anchored_dense_turf(A))
user << "<span class='warning'>The [src]'s error light flickers!</span>"
if(DISPOSALS_MODE) //Making disposals pipes
if(!is_anchored_dense_turf(A))
user << "<span class='warning'>The [src]'s error light flickers; there's something in the way!</span>"
return
user << "<span class='notice'>You start building pipes...</span>"
user << "<span class='notice'>You start building a disposals pipe...</span>"
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 20, target = A))
var/obj/structure/disposalconstruct/C = new (A, queued_p_type ,queued_p_dir)
+1 -1
View File
@@ -172,7 +172,7 @@
user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \
"<span class='notice'>You throw [src]. It lands on [result]. [comment]</span>", \
"<span class='italics'>You hear [src] rolling, it sounds like a [fake_result].</span>")
else if(src.throwing == 0) //Dice was thrown and is coming to rest
else if(!src.throwing) //Dice was thrown and is coming to rest
visible_message("<span class='notice'>[src] rolls to a stop, landing on [result]. [comment]</span>")
/obj/item/weapon/dice/d4/Crossed(mob/living/carbon/human/H)
@@ -37,12 +37,11 @@
//What does the implant do upon injection?
//return 1 if the implant injects
//return -1 if the implant fails to inject
//return 0 if there is no room for implant
//return 0 if there is no room for implant / it fails
/obj/item/weapon/implant/proc/implant(mob/living/target, mob/user, silent = 0)
LAZYINITLIST(target.implants)
if(!target.can_be_implanted() || !can_be_implanted_in(target))
return -1
return 0
for(var/X in target.implants)
if(istype(X, type))
var/obj/item/weapon/implant/imp_e = X
@@ -43,7 +43,7 @@
target.visible_message("<span class='warning'>[target] seems to resist the implant!</span>", "<span class='warning'>You feel the influence of your enemies try to invade your mind!</span>")
qdel(src)
return -1
return 0
/obj/item/weapon/implanter/gang
name = "implanter (gang)"
@@ -24,14 +24,14 @@
target.visible_message("<span class='warning'>[target] seems to resist the implant!</span>", "<span class='warning'>You feel something interfering with your mental conditioning, but you resist it!</span>")
removed(target, 1)
qdel(src)
return -1
return 0
if(target.mind in ticker.mode.get_gangsters())
ticker.mode.remove_gangster(target.mind)
if(!silent)
target.visible_message("<span class='warning'>[src] was destroyed in the process!</span>", "<span class='notice'>You feel a sense of peace and security. You are now protected from brainwashing.</span>")
removed(target, 1)
qdel(src)
return -1
return 0
if(target.mind in ticker.mode.revolutionaries)
ticker.mode.remove_revolutionary(target.mind)
if(!silent)
@@ -38,6 +38,8 @@
M.visible_message("[user] has implanted [M].", "<span class='notice'>[user] implants you.</span>")
imp = null
update_icon()
else
user << "<span class='warning'>[src] fails to implant [M].</span>"
/obj/item/weapon/implanter/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/pen))
@@ -574,7 +574,6 @@
user.changeNext_move(CLICK_CD_MELEE)
playsound(loc, "rustle", 50, 1, -5)
user.visible_message("<span class='notice'>[user] hugs \the [src].</span>","<span class='notice'>You hug \the [src].</span>")
return
/obj/item/weapon/storage/box/hug/medical/New()
..()
@@ -34,6 +34,10 @@
new /obj/item/device/flashlight/flare(src)
new /obj/item/device/radio/off(src)
/obj/item/weapon/storage/toolbox/emergency/old
name = "rusty red toolbox"
item_state = "toolbox_red_old"
/obj/item/weapon/storage/toolbox/mechanical
name = "mechanical toolbox"
icon_state = "blue"
@@ -48,6 +52,10 @@
new /obj/item/device/analyzer(src)
new /obj/item/weapon/wirecutters(src)
/obj/item/weapon/storage/toolbox/mechanical/old
name = "rusty blue toolbox"
item_state = "toolbox_blue_old"
/obj/item/weapon/storage/toolbox/electrical
name = "electrical toolbox"
icon_state = "yellow"
@@ -306,3 +306,7 @@
..()
for(var/i in 1 to 3)
new/obj/item/weapon/grenade/chem_grenade/ez_clean(src)
/obj/item/weapon/storage/box/hug/reverse_revolver/New()
..()
new /obj/item/weapon/gun/ballistic/revolver/reverse(src)
@@ -9,6 +9,7 @@
var/gas_type = "o2"
var/on = FALSE
var/stabilizers = FALSE
var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not
var/datum/effect_system/trail_follow/ion/ion_trail
/obj/item/weapon/tank/jetpack/New()
@@ -133,6 +134,7 @@
volume = 1
slot_flags = null
gas_type = null
full_speed = FALSE
var/datum/gas_mixture/temp_air_contents
var/obj/item/weapon/tank/internals/tank = null
@@ -113,7 +113,7 @@
if(throwing) // you keep some momentum when getting out of a thrown closet
step(AM, dir)
if(throwing)
throwing = 0
throwing.finalize(FALSE)
/obj/structure/closet/proc/take_contents()
var/turf/T = get_turf(src)
@@ -438,3 +438,7 @@
for(var/atom/A in contents)
A.ex_act(severity, target)
CHECK_TICK
/obj/structure/closet/singularity_act()
dump_contents()
..()
+9
View File
@@ -107,6 +107,15 @@
cur_acc[cur_note] = "#" // so shift is never required
else
cur_oct[cur_note] = text2num(ni)
if(user.dizziness > 0 && prob(user.dizziness / 2))
cur_note = Clamp(cur_note + rand(round(-user.dizziness / 10), round(user.dizziness / 10)), 1, 7)
if(user.dizziness > 0 && prob(user.dizziness / 5))
if(prob(30))
cur_acc[cur_note] = "#"
else if(prob(42))
cur_acc[cur_note] = "b"
else if(prob(75))
cur_acc[cur_note] = "n"
playnote(cur_note, cur_acc[cur_note], cur_oct[cur_note])
if(notes.len >= 2 && text2num(notes[2]))
sleep(sanitize_tempo(tempo / text2num(notes[2])))
+6 -9
View File
@@ -30,23 +30,20 @@
/turf/closed/indestructible/splashscreen
name = "Space Station 13"
icon = 'icons/misc/fullscreen.dmi'
icon_state = "title1"
icon_state = "title"
layer = FLY_LAYER
var/titlescreen = TITLESCREEN
/turf/closed/indestructible/splashscreen/New()
/turf/closed/indestructible/splashscreen/Initialize()
..()
icon_state = pick("title1","title2","title3","title4","title5")
if(titlescreen)
icon_state = titlescreen
/turf/closed/indestructible/riveted
icon = 'icons/turf/walls/riveted.dmi'
icon_state = "riveted"
smooth = SMOOTH_TRUE
/turf/closed/indestructible/New()
..()
if(smooth)
queue_smooth(src)
/turf/closed/indestructible/riveted/uranium
icon = 'icons/turf/walls/uranium_wall.dmi'
icon_state = "uranium"
@@ -64,7 +61,7 @@
smooth = SMOOTH_TRUE
icon = 'icons/obj/smooth_structures/reinforced_window.dmi'
/turf/closed/indestructible/fakeglass/New()
/turf/closed/indestructible/fakeglass/Initialize()
..()
icon_state = null //set the icon state to null, so our base state isn't visible
var/image/I = image('icons/obj/structures.dmi', loc = src, icon_state = "grille")
+4 -6
View File
@@ -29,22 +29,20 @@
baseturf = /turf/open/indestructible/necropolis
initial_gas_mix = "o2=14;n2=23;TEMP=300"
/turf/open/indestructible/necropolis/New()
/turf/open/indestructible/necropolis/Initialize()
..()
if(prob(12))
icon_state = "necro[rand(2,3)]"
/turf/open/indestructible/necropolis/air
initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
/turf/open/indestructible/hierophant
icon = 'icons/turf/floors/hierophant_floor.dmi'
initial_gas_mix = "o2=14;n2=23;TEMP=300"
baseturf = /turf/open/indestructible/hierophant
smooth = SMOOTH_TRUE
/turf/open/indestructible/hierophant/New()
..()
if(smooth)
queue_smooth(src)
/turf/open/indestructible/hierophant/two
/turf/open/indestructible/paper
+1 -1
View File
@@ -69,7 +69,7 @@
L.adjustBruteLoss(30)
/turf/open/chasm/straight_down/New()
/turf/open/chasm/straight_down/Initialize()
..()
drop_x = x
drop_y = y
+3 -6
View File
@@ -33,7 +33,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
var/list/broken_states
var/list/burnt_states
/turf/open/floor/New()
/turf/open/floor/Initialize(mapload)
if (!broken_states)
broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
if (!burnt_states)
@@ -43,6 +43,8 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
icon_regular_floor = "floor"
else
icon_regular_floor = icon_state
if(mapload)
MakeDirty()
/turf/open/floor/ex_act(severity, target)
var/shielded = is_shielded()
@@ -179,10 +181,5 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
if(.)
ChangeTurf(/turf/open/floor/clockwork)
/turf/open/floor/Initialize(mapload)
..()
if(mapload)
MakeDirty()
/turf/open/floor/acid_melt()
ChangeTurf(baseturf)
@@ -36,10 +36,9 @@
flags = NONE
var/ore_type = /obj/item/weapon/ore/glass
/turf/open/floor/grass/New()
/turf/open/floor/grass/Initialize()
..()
spawn(1)
update_icon()
update_icon()
/turf/open/floor/grass/attackby(obj/item/C, mob/user, params)
if(istype(C, /obj/item/weapon/shovel) && params)
@@ -76,7 +75,7 @@
initial_gas_mix = "o2=14;n2=23;TEMP=300"
slowdown = 0
/turf/open/floor/grass/snow/basalt/New()
/turf/open/floor/grass/snow/basalt/Initialize()
..()
if(prob(15))
icon_state = "basalt[rand(0, 12)]"
@@ -96,10 +95,9 @@
canSmoothWith = null
flags = NONE
/turf/open/floor/carpet/New()
/turf/open/floor/carpet/Initialize()
..()
spawn(1)
update_icon()
update_icon()
/turf/open/floor/carpet/update_icon()
if(!..())
@@ -131,6 +129,6 @@
broken_states = list("damaged")
plane = PLANE_SPACE
/turf/open/floor/fakespace/New()
/turf/open/floor/fakespace/Initialize()
..()
icon_state = "[rand(0,25)]"
@@ -12,7 +12,7 @@
var/can_modify_colour = TRUE
/turf/open/floor/light/New()
/turf/open/floor/light/Initialize()
..()
update_icon()
@@ -16,7 +16,7 @@
/turf/open/floor/mineral/New()
/turf/open/floor/mineral/Initialize()
broken_states = list("[initial(icon_state)]_dam")
..()
if (!icons)
@@ -221,7 +221,7 @@
floor_tile = /obj/item/stack/tile/mineral/abductor
icons = list("alienpod1", "alienpod2", "alienpod3", "alienpod4", "alienpod5", "alienpod6", "alienpod7", "alienpod8", "alienpod9")
/turf/open/floor/mineral/abductor/New()
/turf/open/floor/mineral/abductor/Initialize()
..()
icon_state = "alienpod[rand(1,9)]"
@@ -13,9 +13,9 @@
icon_state = "bcircuit"
floor_tile = /obj/item/stack/tile/plasteel
/turf/open/floor/bluegrid/New()
..()
/turf/open/floor/bluegrid/Initialize()
SSmapping.nuke_tiles += src
..()
/turf/open/floor/bluegrid/Destroy()
SSmapping.nuke_tiles -= src
@@ -67,7 +67,7 @@
icon_state = "plating"
var/obj/effect/clockwork/overlay/floor/realappearence
/turf/open/floor/clockwork/New()
/turf/open/floor/clockwork/Initialize()
..()
new /obj/effect/overlay/temp/ratvar/floor(src)
new /obj/effect/overlay/temp/ratvar/beam(src)
+1 -1
View File
@@ -13,7 +13,7 @@
icon_state = "plating"
intact = 0
/turf/open/floor/plating/New()
/turf/open/floor/plating/Initialize()
if (!broken_states)
broken_states = list("platingdmg1", "platingdmg2", "platingdmg3")
if (!burnt_states)
@@ -15,7 +15,7 @@
var/sand_type = /obj/item/weapon/ore/glass
var/floor_variance = 20 //probability floor has a different icon state
/turf/open/floor/plating/asteroid/New()
/turf/open/floor/plating/asteroid/Initialize()
var/proper_name = name
..()
name = proper_name
@@ -117,7 +117,7 @@
/turf/open/floor/plating/asteroid/basalt/airless
initial_gas_mix = "TEMP=2.7"
/turf/open/floor/plating/asteroid/basalt/New()
/turf/open/floor/plating/asteroid/basalt/Initialize()
..()
switch(icon_state)
if("basalt1", "basalt2", "basalt3") //5 and 9 are too dark to glow and make the amount of glows in tunnels too high
@@ -176,7 +176,7 @@
/turf/open/floor/plating/asteroid/airless/cave/volcanic/has_data //subtype for producing a tunnel with given data
has_data = TRUE
/turf/open/floor/plating/asteroid/airless/cave/New(loc)
/turf/open/floor/plating/asteroid/airless/cave/Initialize()
if (!mob_spawn_list)
mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goldgrub = 1, /mob/living/simple_animal/hostile/asteroid/goliath = 5, /mob/living/simple_animal/hostile/asteroid/basilisk = 4, /mob/living/simple_animal/hostile/asteroid/hivelord = 3)
if (!megafauna_spawn_list)
@@ -186,7 +186,8 @@
if(!has_data)
produce_tunnel_from_data()
..()
else
..() //do not continue after changeturfing or we will do a double initialize
/turf/open/floor/plating/asteroid/airless/cave/proc/get_cave_data(set_length, exclude_dir = -1)
// If set_length (arg1) isn't defined, get a random length; otherwise assign our length to the length arg.
@@ -7,12 +7,6 @@
baseturf = /turf/open/floor/plating/lava //lava all the way down
slowdown = 2
luminosity = 1
var/static/list/safeties_typecache = list(/obj/structure/lattice/catwalk)
//if anything matching this typecache is found in the lava, we don't burn things
/turf/open/floor/plating/lava/New()
..()
safeties_typecache = typecacheof(safeties_typecache)
/turf/open/floor/plating/lava/ex_act()
return
@@ -51,7 +45,9 @@
/turf/open/floor/plating/lava/proc/is_safe()
var/list/found_safeties = typecache_filter_list(contents, safeties_typecache)
//if anything matching this typecache is found in the lava, we don't burn things
var/static/list/lava_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk))
var/list/found_safeties = typecache_filter_list(contents, lava_safeties_typecache)
return LAZYLEN(found_safeties)
@@ -7,7 +7,7 @@
name = "alien floor"
icon_state = "alienpod1"
/turf/open/floor/plating/abductor/New()
/turf/open/floor/plating/abductor/Initialize()
..()
icon_state = "alienpod[rand(1,9)]"
@@ -41,7 +41,7 @@
initial_gas_mix = "o2=14;n2=23;TEMP=300"
planetary_atmos = TRUE
/turf/open/floor/plating/ashplanet/New()
/turf/open/floor/plating/ashplanet/Initialize()
if(smooth)
pixel_y = -4
pixel_x = -4
@@ -72,7 +72,7 @@
icon_state = "wateryrock"
slowdown = 2
/turf/open/floor/plating/ashplanet/wateryrock/New()
/turf/open/floor/plating/ashplanet/wateryrock/Initialize()
icon_state = "[icon_state][rand(1, 9)]"
..()
@@ -113,7 +113,7 @@
name = "iron sand"
desc = "Like sand, but more <i>metal</i>."
/turf/open/floor/plating/ironsand/New()
/turf/open/floor/plating/ironsand/Initialize()
..()
icon_state = "ironsand[rand(1,15)]"
@@ -106,7 +106,7 @@
icon_state = "plating"
var/obj/effect/clockwork/overlay/floor/bloodcult/realappearence
/turf/open/floor/engine/cult/New()
/turf/open/floor/engine/cult/Initialize()
..()
new /obj/effect/overlay/temp/cult/turf/floor(src)
realappearence = new /obj/effect/clockwork/overlay/floor/bloodcult(src)
+3 -3
View File
@@ -24,7 +24,7 @@
var/scan_state = null //Holder for the image we display when we're pinged by a mining scanner
var/defer_change = 0
/turf/closed/mineral/New()
/turf/closed/mineral/Initialize()
if (!canSmoothWith)
canSmoothWith = list(/turf/closed)
pixel_y = -4
@@ -139,7 +139,7 @@
var/mineralChance = 13
var/display_icon_state = "rock"
/turf/closed/mineral/random/New()
/turf/closed/mineral/random/Initialize()
if (!mineralSpawnChanceList)
mineralSpawnChanceList = list(
/turf/closed/mineral/uranium = 5, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 10,
@@ -385,7 +385,7 @@
var/activated_name = null
var/activated_image = null
/turf/closed/mineral/gibtonite/New()
/turf/closed/mineral/gibtonite/Initialize()
det_time = rand(8,10) //So you don't know exactly when the hot potato will explode
..()
+2 -2
View File
@@ -8,7 +8,7 @@
sheet_amount = 1
girder_type = /obj/structure/girder/cult
/turf/closed/wall/mineral/cult/New()
/turf/closed/wall/mineral/cult/Initialize()
new /obj/effect/overlay/temp/cult/turf(src)
..()
@@ -50,7 +50,7 @@
var/obj/effect/clockwork/overlay/wall/realappearence
var/obj/structure/destructible/clockwork/cache/linkedcache
/turf/closed/wall/clockwork/New()
/turf/closed/wall/clockwork/Initialize()
..()
new /obj/effect/overlay/temp/ratvar/wall(src)
new /obj/effect/overlay/temp/ratvar/beam(src)
+7 -6
View File
@@ -15,15 +15,16 @@
var/global/datum/gas_mixture/space/space_gas = new
plane = PLANE_SPACE
/turf/open/space/New()
/turf/open/space/Initialize()
icon_state = SPACE_ICON_STATE
air = space_gas
if(initialized)
stack_trace("Warning: [src]([type]) initialized multiple times!")
initialized = TRUE
/turf/open/space/Destroy(force)
if(force)
. = ..()
else
return QDEL_HINT_LETMELIVE
if(requires_activation)
SSair.add_to_active(src)
/turf/open/space/attack_ghost(mob/dead/observer/user)
if(destination_z)
+1 -3
View File
@@ -61,14 +61,12 @@
/turf/open/space/transit/attackby()
return
/turf/open/space/transit/New()
/turf/open/space/transit/Initialize()
..()
update_icon()
for(var/atom/movable/AM in src)
throw_atom(AM)
/turf/open/space/transit/proc/update_icon()
var/p = 9
var/angle = 0
+12 -3
View File
@@ -23,14 +23,17 @@
var/explosion_id = 0
var/list/decals
var/requires_activation //add to air processing after initialize?
/turf/SDQL_update(const/var_name, new_value)
if(var_name == "x" || var_name == "y" || var_name == "z")
return FALSE
. = ..()
/turf/New()
..()
/turf/Initialize()
if(initialized)
stack_trace("Warning: [src]([type]) initialized multiple times!")
initialized = TRUE
levelupdate()
if(smooth)
@@ -40,11 +43,17 @@
for(var/atom/movable/AM in src)
Entered(AM)
if(requires_activation)
CalculateAdjacentTurfs()
SSair.add_to_active(src)
/turf/proc/Initalize_Atmos(times_fired)
CalculateAdjacentTurfs()
/turf/Destroy()
visibilityChanged()
initialized = FALSE
requires_activation = FALSE
..()
return QDEL_HINT_HARDDEL_NOW
@@ -454,4 +463,4 @@
/turf/proc/remove_decal(group)
LAZYINITLIST(decals)
overlays -= decals[group]
decals[group] = null
decals[group] = null