Merge branch 'master' into turn-both-keys

Conflicts:
	tgui/assets/tgui.js
This commit is contained in:
Jack Edge
2016-07-08 19:49:12 +01:00
136 changed files with 3492 additions and 2343 deletions
+8 -29
View File
@@ -1423,7 +1423,7 @@
"do" = (
/obj/structure/closet/crate,
/obj/item/weapon/card/id{
access = list(12);
access = list(200,201);
name = "Staff ID"
},
/turf/open/floor/plasteel/whitebot,
@@ -2114,30 +2114,12 @@
/area/ruin/hotel/workroom)
"fo" = (
/obj/structure/table,
/obj/item/weapon/card/id{
access = list(12);
name = "Staff ID"
},
/obj/item/weapon/card/id{
access = list(12);
name = "Staff ID"
},
/obj/item/weapon/card/id{
access = list(12);
name = "Staff ID"
},
/obj/item/weapon/card/id{
access = list(12);
name = "Staff ID"
},
/obj/item/weapon/card/id{
access = list(12);
name = "Staff ID"
},
/obj/item/weapon/card/id{
access = list(12);
name = "Staff ID"
},
/obj/item/weapon/card/id/away/hotel,
/obj/item/weapon/card/id/away/hotel,
/obj/item/weapon/card/id/away/hotel,
/obj/item/weapon/card/id/away/hotel,
/obj/item/weapon/card/id/away/hotel,
/obj/item/weapon/card/id/away/hotel,
/turf/open/floor/plasteel/black,
/area/ruin/hotel/workroom)
"fp" = (
@@ -3252,10 +3234,7 @@
/area/ruin/hotel/pool)
"hN" = (
/obj/structure/table,
/obj/item/weapon/card/id{
access = list(200,201,203);
name = "Security Staff ID"
},
/obj/item/weapon/card/id/away/hotel/securty,
/turf/open/floor/plasteel/darkred,
/area/ruin/hotel/security)
"hO" = (
+34 -30
View File
@@ -30985,7 +30985,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel/green/side,
/turf/open/floor/plasteel/green/corner,
/area/hallway/primary/port{
name = "Fore Port Hallway"
})
@@ -31002,9 +31002,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel/green/corner{
dir = 8
},
/turf/open/floor/plasteel/green/side,
/area/hallway/primary/port{
name = "Fore Port Hallway"
})
@@ -40419,17 +40417,13 @@
/turf/open/floor/plasteel/black,
/area/bridge)
"bDi" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plasteel/green/corner{
dir = 8
},
/obj/structure/disposalpipe/segment{
dir = 4
},
/turf/open/floor/plasteel/darkblue/side{
tag = "icon-darkblue (EAST)";
dir = 4
},
/area/bridge)
/area/hallway/primary/port{
name = "Fore Port Hallway"
})
"bDj" = (
/obj/machinery/firealarm{
dir = 2;
@@ -41757,15 +41751,17 @@
/turf/open/floor/plasteel/black,
/area/bridge)
"bFB" = (
/obj/structure/cable/blue{
tag = "icon-4-8";
icon_state = "4-8"
},
/turf/open/floor/plasteel/darkblue/side{
tag = "icon-darkblue (EAST)";
/turf/open/floor/plasteel/brown/corner,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/area/bridge)
/obj/structure/disposalpipe/segment{
dir = 4
},
/turf/open/floor/plasteel/warningline/corner,
/area/hallway/primary/starboard{
name = "Aft Starboard Hallway"
})
"bFC" = (
/obj/structure/cable/blue{
tag = "icon-4-8";
@@ -43262,17 +43258,24 @@
/turf/open/floor/plasteel/black,
/area/bridge)
"bHJ" = (
/turf/open/floor/plasteel/brown/corner{
tag = "icon-browncorner (WEST)";
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/structure/disposalpipe/segment{
dir = 4
},
/turf/open/floor/plasteel/darkblue/side{
tag = "icon-darkblue (EAST)";
dir = 4
/turf/open/floor/plasteel/warningline/corner{
tag = "icon-warninglinecorners (WEST)";
icon_state = "warninglinecorners";
dir = 8
},
/area/bridge)
/area/hallway/primary/starboard{
name = "Aft Starboard Hallway"
})
"bHK" = (
/obj/machinery/airalarm{
dir = 1;
@@ -52595,13 +52598,14 @@
name = "Aft Starboard Hallway"
})
"bZn" = (
/turf/open/floor/plasteel/brown,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/structure/disposalpipe/segment{
dir = 4
},
/turf/open/floor/plasteel/warning,
/turf/open/floor/plasteel/warningline,
/area/hallway/primary/starboard{
name = "Aft Starboard Hallway"
})
@@ -98153,7 +98157,7 @@ aKx
bhq
biu
bjP
bla
bkT
bmE
boj
bqx
@@ -99181,7 +99185,7 @@ aSP
aRO
biv
bjS
bkX
bDi
bmE
boj
bqA
@@ -115908,7 +115912,7 @@ bJG
bVn
bWF
bXN
bZm
bFB
caE
ccn
cet
@@ -116422,7 +116426,7 @@ bMQ
bJG
bWH
bXN
bZo
bHJ
caH
ccp
cev
+19 -14
View File
@@ -27537,8 +27537,8 @@
d2 = 2;
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
@@ -28505,6 +28505,7 @@
d2 = 4;
icon_state = "1-4"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"bmk" = (
@@ -32636,11 +32637,8 @@
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"buC" = (
/obj/machinery/atmospherics/components/unary/vent_pump{
dir = 1;
external_pressure_bound = 101.325;
on = 1;
pressure_checks = 1
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
@@ -60669,6 +60667,13 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/maintenance/port)
"cCo" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/quartermaster/storage)
(1,1,1) = {"
aaa
@@ -79567,11 +79572,11 @@ bjl
bkG
bkp
bmj
bjr
bmb
bjr
bjr
bjr
bjt
cCo
bjt
bjt
biq
bvV
blW
aaa
@@ -79828,7 +79833,7 @@ bjr
bmb
bjr
bjr
bjr
buC
bvV
blW
aaa
@@ -80085,7 +80090,7 @@ boK
bpz
boK
bjr
buC
bkt
bvV
blW
aaa
File diff suppressed because it is too large Load Diff
+4
View File
@@ -310,6 +310,9 @@ var/list/bloody_footprints_cache = list()
#define POLLTYPE_TEXT "TEXT"
#define POLLTYPE_RATING "NUMVAL"
#define POLLTYPE_MULTI "MULTICHOICE"
#define POLLTYPE_IRV "IRV"
//lighting area defines
#define DYNAMIC_LIGHTING_DISABLED 0 //dynamic lighting disabled (area stays at full brightness)
@@ -471,3 +474,4 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define debug_world_log(msg) if (Debug2) world.log << "DEBUG: [msg]"
#define COORD(A) "([A.x],[A.y],[A.z])"
#define INCREMENT_TALLY(L, stat) if(L[stat]){L[stat]++}else{L[stat] = 1}
+17
View File
@@ -297,6 +297,23 @@ so as to remain in compliance with the most up-to-date laws."
icon_state = "newlaw"
timeout = 300
/obj/screen/alert/hackingapc
name = "Hacking APC"
desc = "An Area Power Controller is being hacked. When the process is \
complete, you will have exclusive control of it, and you will gain \
additional processing time to unlock more malfunction abilities."
icon_state = "hackingapc"
timeout = 600
var/atom/target = null
/obj/screen/alert/hackingapc/Click()
if(!usr || !usr.client) return
if(!target) return
var/mob/living/silicon/ai/AI = usr
var/turf/T = get_turf(target)
if(T)
AI.eyeobj.setLoc(T)
//MECHS
/obj/screen/alert/low_mech_integrity
+2 -2
View File
@@ -87,7 +87,7 @@
/mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area)
var/message_verb = "attacked"
if(I.attack_verb.len)
if(I.attack_verb && I.attack_verb.len)
message_verb = "[pick(I.attack_verb)]"
else if(!I.force)
return 0
@@ -110,4 +110,4 @@
visible_message("<span class='warning'>[I] bounces harmlessly off of [src].</span>",\
"<span class='warning'>[I] bounces harmlessly off of [src]!</span>")
else
return ..()
return ..()
-4
View File
@@ -60,10 +60,6 @@
/mob/living/UnarmedAttack(atom/A)
A.attack_animal(src)
/mob/living/simple_animal/hostile/UnarmedAttack(atom/A)
target = A
AttackingTarget()
/atom/proc/attack_animal(mob/user)
return
/mob/living/RestrainedClickOn(atom/A)
+48
View File
@@ -0,0 +1,48 @@
var/datum/subsystem/pool/SSpool
/datum/subsystem/pool
name = "Pool"
init_order = 20
flags = SS_BACKGROUND | SS_FIRE_IN_LOBBY
var/list/global_pool
var/list/pool_levels = list()
var/sum = 0
var/list/maintained_types = list(
/obj/item/stack/tile/plasteel = 100
)
var/list/stats_placed_in_pool = list()
var/list/stats_pooled_or_newed = list()
var/list/stats_reused = list()
var/list/stats_created_new = list()
/datum/subsystem/pool/New()
NEW_SS_GLOBAL(SSpool)
/datum/subsystem/pool/Initialize(timeofday)
global_pool = GlobalPool
/datum/subsystem/pool/stat_entry(msg)
if(global_pool)
msg += "Types: [global_pool.len]|Total Pooled Objects: [sum]"
else
msg += "NULL POOL"
..(msg)
/datum/subsystem/pool/fire()
sum = 0
for(var/type in global_pool + maintained_types)
var/list/L = global_pool[type]
var/required_number = maintained_types[type] || 0
// Update pool levels and tracker
var/amount = 0
if(L)
amount = L.len
sum += amount
// why yes, just inflate the pool at one item per tick
if(amount < required_number)
var/diver = new type
qdel(diver)
@@ -91,13 +91,16 @@ This file's folder contains:
M.visible_message("<span class='heavy_brass'>[M]'s eyes glow a blazing yellow!</span>", \
"<span class='heavy_brass'>Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork Justiciar above all else. Perform his every \
whim without hesitation.</span>")
var/list/scripture_states = get_scripture_states()
ticker.mode.servants_of_ratvar += M.mind
scripture_unlock_alert(scripture_states)
ticker.mode.update_servant_icons_added(M.mind)
M.mind.special_role = "Servant of Ratvar"
M.languages_spoken |= RATVAR
M.languages_understood |= RATVAR
all_clockwork_mobs += M
M.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them for whatever reason, we need to update buttons
M.attack_log += "\[[time_stamp()]\] <span class='brass'>Has been converted to the cult of Ratvar!</span>"
if(issilicon(M))
var/mob/living/silicon/S = M
if(isrobot(S))
@@ -120,7 +123,9 @@ This file's folder contains:
if(!silent)
M.visible_message("<span class='big'>[M] seems to have remembered their true allegiance!</span>", \
"<span class='userdanger'>A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.</span>")
var/list/scripture_states = get_scripture_states()
ticker.mode.servants_of_ratvar -= M.mind
scripture_unlock_alert(scripture_states)
ticker.mode.update_servant_icons_removed(M.mind)
all_clockwork_mobs -= M
M.mind.memory = "" //Not sure if there's a better way to do this
@@ -128,6 +133,7 @@ This file's folder contains:
M.languages_spoken &= ~RATVAR
M.languages_understood &= ~RATVAR
M.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them, we need to update buttons
M.attack_log += "\[[time_stamp()]\] <span class='brass'>Has renounced the cult of Ratvar!</span>"
for(var/datum/action/innate/function_call/F in M.actions) //Removes any bound Ratvarian spears
qdel(F)
if(issilicon(M))
+44 -25
View File
@@ -218,7 +218,7 @@
user << "<i>Inath-Neq: </i>[clockwork_generals_invoked["inath-neq"] <= world.time ? "<font color='green'><b>Ready</b></font>" : "<span class='boldannounce'>Invoked</span>"]"
/obj/item/clockwork/slab/proc/show_guide(mob/living/user)
var/text = "<font color=#BE8700 size=3><b><center>Chetr nyy hagehguf naq ubabe Ratvar.</center></b></font><br><br>\
var/text = "<font color=#BE8700 size=3><b><center>Chetr nyy hagehguf-naq-ubabe Ratvar.</center></b></font><br><br>\
\
First and foremost, you serve Ratvar, the Clockwork Justiciar, in any ways he sees fit. This is with no regard to your personal well-being, and you would do well to think of the larger \
scale of things than your life. Through foul and unholy magics was the Celestial Derelict formed, and fouler still those which trapped your master within it for all eternity. The Justiciar \
@@ -359,19 +359,27 @@
if(is_servant_of_ratvar(user) || isobserver(user))
user << "Use the <span class='brass'>Hierophant Network</span> action button to communicate with other servants."
user << "Clockwork slabs will only generate components if held by a human or if inside a storage item held by a human, and when generating a component will prevent all other slabs held from generating components."
user << "<b>Stored components (with global cache):</b>"
user << "<span class='neovgre_small'><i>Belligerent Eyes:</i> [stored_components["belligerent_eye"]] ([stored_components["belligerent_eye"] + clockwork_component_cache["belligerent_eye"]])</span>"
user << "<span class='inathneq_small'><i>Vanguard Cogwheels:</i> [stored_components["vanguard_cogwheel"]] ([stored_components["vanguard_cogwheel"] + clockwork_component_cache["vanguard_cogwheel"]])</span>"
user << "<span class='sevtug_small'><i>Guvax Capacitors:</i> [stored_components["guvax_capacitor"]] ([stored_components["guvax_capacitor"] + clockwork_component_cache["guvax_capacitor"]])</span>"
user << "<span class='nezbere_small'><i>Replicant Alloys:</i> [stored_components["replicant_alloy"]] ([stored_components["replicant_alloy"] + clockwork_component_cache["replicant_alloy"]])</span>"
user << "<span class='nzcrentr_small'><i>Hierophant Ansibles:</i> [stored_components["hierophant_ansible"]] ([stored_components["hierophant_ansible"] + clockwork_component_cache["hierophant_ansible"]])</span>"
if(clockwork_caches)
user << "<b>Stored components (with global cache):</b>"
user << "<span class='neovgre_small'><i>Belligerent Eyes:</i> [stored_components["belligerent_eye"]] ([stored_components["belligerent_eye"] + clockwork_component_cache["belligerent_eye"]])</span>"
user << "<span class='inathneq_small'><i>Vanguard Cogwheels:</i> [stored_components["vanguard_cogwheel"]] ([stored_components["vanguard_cogwheel"] + clockwork_component_cache["vanguard_cogwheel"]])</span>"
user << "<span class='sevtug_small'><i>Guvax Capacitors:</i> [stored_components["guvax_capacitor"]] ([stored_components["guvax_capacitor"] + clockwork_component_cache["guvax_capacitor"]])</span>"
user << "<span class='nezbere_small'><i>Replicant Alloys:</i> [stored_components["replicant_alloy"]] ([stored_components["replicant_alloy"] + clockwork_component_cache["replicant_alloy"]])</span>"
user << "<span class='nzcrentr_small'><i>Hierophant Ansibles:</i> [stored_components["hierophant_ansible"]] ([stored_components["hierophant_ansible"] + clockwork_component_cache["hierophant_ansible"]])</span>"
else
user << "<b>Stored components:</b>"
user << "<span class='neovgre_small'><i>Belligerent Eyes:</i> [stored_components["belligerent_eye"]]</span>"
user << "<span class='inathneq_small'><i>Vanguard Cogwheels:</i> [stored_components["vanguard_cogwheel"]]</span>"
user << "<span class='sevtug_small'><i>Guvax Capacitors:</i> [stored_components["guvax_capacitor"]]</span>"
user << "<span class='nezbere_small'><i>Replicant Alloys:</i> [stored_components["replicant_alloy"]]</span>"
user << "<span class='nzcrentr_small'><i>Hierophant Ansibles:</i> [stored_components["hierophant_ansible"]]</span>"
/obj/item/clockwork/slab/proc/show_hierophant(mob/living/user)
var/message = stripped_input(user, "Enter a message to send to your fellow servants.", "Hierophant")
if(!message || !user || !user.canUseTopic(src))
return 0
user.whisper("Freinagf, urne zl jbeqf. [message]")
send_hierophant_message(user, message)
user.whisper("Freinagf, urne zl-jbeqf. [message]")
titled_hierophant_message(user, message)
return 1
/obj/item/clothing/glasses/wraith_spectacles //Wraith spectacles: Grants night and x-ray vision at the slow cost of the wearer's sight. Nar-Sian cultists are instantly blinded.
@@ -442,6 +450,7 @@
var/active = FALSE //If the visor is online
var/recharging = FALSE //If the visor is currently recharging
var/obj/item/weapon/ratvars_flame/flame //The linked flame object
var/recharge_cooldown = 300 //divided by 10 if ratvar is alive
actions_types = list(/datum/action/item_action/toggle_flame)
/obj/item/clothing/glasses/judicial_visor/item_action_slot_check(slot, mob/user)
@@ -459,7 +468,9 @@
return 0
if(is_servant_of_ratvar(user))
update_status(TRUE)
else if(iscultist(user)) //Cultists spontaneously combust
else
update_status(FALSE)
if(iscultist(user)) //Cultists spontaneously combust
user << "<span class='heavy_brass'>\"Consider yourself judged, whelp.\"</span>"
user << "<span class='userdanger'>You suddenly catch fire!</span>"
user.adjust_fire_stacks(5)
@@ -481,10 +492,12 @@
C << "<span class='warning'>You require a free hand to utilize [src]'s power!</span>"
return 0
C.visible_message("<span class='warning'>[C]'s hand is enveloped in violet flames!<span>", "<span class='brass'><i>You harness [src]'s power. <b>Direct it at a tile at any range</b> to unleash it, or use the action button again to dispel it.</i></span>")
var/obj/item/weapon/ratvars_flame/R = new(get_turf(C))
var/turf/T = get_turf(C)
var/obj/item/weapon/ratvars_flame/R = new(T)
flame = R
C.put_in_hands(R)
R.visor = src
add_logs(C, T, "prepared ratvar's flame", src)
user.update_action_buttons_icon()
/obj/item/clothing/glasses/judicial_visor/proc/update_status(change_to)
@@ -555,13 +568,15 @@
continue
V.recharging = TRUE //To prevent exploiting multiple visors to bypass the cooldown
V.update_status()
addtimer(V, "recharge_visor", ratvar_awakens ? 60 : 600, FALSE, user)
clockwork_say(user, "Xarry, urn'guraf!")
addtimer(V, "recharge_visor", (ratvar_awakens ? visor.recharge_cooldown*0.1 : visor.recharge_cooldown) * 2, FALSE, user)
clockwork_say(user, "Xarry, urngur'af!")
user.visible_message("<span class='warning'>The flame in [user]'s hand rushes to [target]!</span>", "<span class='heavy_brass'>You direct [visor]'s power to [target]. You must wait for some time before doing this again.</span>")
new/obj/effect/clockwork/judicial_marker(get_turf(target), user)
var/turf/T = get_turf(target)
new/obj/effect/clockwork/judicial_marker(T, user)
add_logs(user, T, "used ratvar's flame to create a judicial marker")
user.update_action_buttons_icon()
user.update_inv_glasses()
addtimer(visor, "recharge_visor", ratvar_awakens ? 30 : 300, FALSE, user)//Cooldown is reduced by 10x if Ratvar is up
addtimer(visor, "recharge_visor", ratvar_awakens ? visor.recharge_cooldown*0.1 : visor.recharge_cooldown, FALSE, user)//Cooldown is reduced by 10x if Ratvar is up
qdel(src)
return 1
@@ -695,8 +710,9 @@
icon = 'icons/obj/clockwork_objects.dmi'
icon_state = "ratvarian_spear"
item_state = "ratvarian_spear"
force = 17 //Extra damage is dealt to silicons in afterattack()
force = 17 //Extra damage is dealt to silicons in attack()
throwforce = 40
sharpness = IS_SHARP_ACCURATE
attack_verb = list("stabbed", "poked", "slashed")
hitsound = 'sound/weapons/bladeslice.ogg'
w_class = 4
@@ -962,7 +978,7 @@
clockwork_desc = "A broken gear lock for pinion airlocks. Might still be serviceable as a substitute for a vanguard cogwheel."
icon_state = "pinion_lock"
cultist_message = "The gear grows warm in your hands."
servant_of_ratvar_messages = list("The lock isn't getting any lighter.", "\"Qnzntrq trnef ner orggre guna oebxra obqvrf.\"", "\"Vg pbhyq fgvyy or hfrq, vs gurer jnf n qbbe gb cynpr vg ba.\"")
servant_of_ratvar_messages = list("The lock isn't getting any lighter.", "\"Qnzntrq trnef ner orggr-e gun'a oebxra obqvrf.\"", "\"Vg pbhyq fgv'yy or hfrq, vs gur'er jnf n qbbe gb-cynpr vg ba.\"")
w_class = 3
/obj/item/clockwork/component/guvax_capacitor
@@ -971,7 +987,8 @@
icon_state = "guvax_capacitor"
component_id = "guvax_capacitor"
cultist_message = "\"Try not to lose your mind - I'll need it. Heh heh...\""
servant_of_ratvar_messages = list("\"Disgusting.\"", "\"Well, aren't you an inquisitive fellow?\"", "A foul presence pervades your mind, then vanishes.", "\"The fact that Ratvar has to depend on simpletons like you is appalling.\"")
servant_of_ratvar_messages = list("\"Disgusting.\"", "\"Well, aren't you an inquisitive fellow?\"", "A foul presence pervades your mind, then vanishes.", \
"\"The fact that Ratvar has to depend on simpletons like you is appalling.\"")
message_span = "sevtug"
/obj/item/clockwork/component/guvax_capacitor/antennae
@@ -980,7 +997,8 @@
clockwork_desc = "The antennae from a mania motor. May be usable as a substitute for a guvax capacitor."
icon_state = "mania_motor_antennae"
cultist_message = "Your head is filled with a burst of static."
servant_of_ratvar_messages = list("\"Jub oebxr guvf.\"", "\"Qvq lbh oernx gurfr bss LBHEFRYS?\"", "\"Jul qvq jr tvir guvf gb fhpu fvzcyrgbaf, naljnl?\"", "\"Ng yrnfg jr pna hfr gur'fr sbe fbzrguvat - hayvxr lbh.\"")
servant_of_ratvar_messages = list("\"Jub oebxr guv'f.\"", "\"Qvq lbh oernx gur'fr bss LBHEFRYS?\"", "\"Jul qvq jr tvir guv'f gb-fhpu fvzcy-rgbaf, naljnl?\"", \
"\"Ng yrnfg jr pna hfr gur'fr sbe fbzrguv'at - hayvxr lbh.\"")
/obj/item/clockwork/component/replicant_alloy
name = "replicant alloy"
@@ -988,7 +1006,8 @@
icon_state = "replicant_alloy"
component_id = "replicant_alloy"
cultist_message = "The alloy takes on the appearance of a screaming face for a moment."
servant_of_ratvar_messages = list("\"There's always something to be done. Get to it.\"", "\"Idle hands are worse than broken ones. Get to work.\"", "A detailed image of Ratvar appears in the alloy for a moment.")
servant_of_ratvar_messages = list("\"There's always something to be done. Get to it.\"", "\"Idle hands are worse than broken ones. Get to work.\"", \
"A detailed image of Ratvar appears in the alloy for a moment.")
message_span = "nezbere"
/obj/item/clockwork/component/replicant_alloy/examine(mob/user)
@@ -1021,9 +1040,9 @@
desc = "Some sort of transmitter? It seems as though it's trying to say something."
icon_state = "hierophant_ansible"
component_id = "hierophant_ansible"
cultist_message = "\"Gur obff nlf vg'f abg ntnvafg gur ehyrf gb xvyy lbh.\""
servant_of_ratvar_messages = list("\"Rkvyr vf fhpu n'ober. Gurer'f abguvat v'pna uhag va urer.\"", "\"Jung'f xrrcvat lbh? V'jnag gb tb xvyy fbzrguvat.\"", "\"HEHEHEHEHEHEH!\"", \
"\"Vs V xvyyrq lbh snfg rabhtu, qb lbh guvax gur obff jbhyq abgvpr?\"")
cultist_message = "\"Gur obff fnlf vg'f abg ntnvafg gur ehyrf gb-xvyy lbh.\""
servant_of_ratvar_messages = list("\"Rkvyr vf fhpu n ober. Gur'er'f abguvat V pna uhag va urer.\"", "\"Jung'f xrrcvat lbh? V jnag gb-tb xvyy fbzrguv'at.\"", "\"HEHEHEHEHEHEH!\"", \
"\"Vs V xvyyrq lbh snfg rabhtu, qb lbh guv'ax gur obff jbhyq abgv'pr?\"")
message_span = "nzcrentr"
/obj/item/clockwork/component/hierophant_ansible/obelisk
@@ -1031,8 +1050,8 @@
desc = "A prism that occasionally glows brightly. It seems not-quite there."
clockwork_desc = "The prism from a clockwork obelisk. Likely suitable as a substitute for a hierophant ansible."
cultist_message = "The prism flickers wildly in your hands before resuming its normal glow."
servant_of_ratvar_messages = list("You hear the distinctive sound of the Hierophant Network for a moment.","\"Uvrebcu'nag Oe'b'nq pnf'g snvy'her.\"",\
"The obelisk flickers wildly, as if trying to open a gateway.", "\"Fcng'vny Tn'g'r jn'l snv'yher.\"")
servant_of_ratvar_messages = list("You hear the distinctive sound of the Hierophant Network for a moment.","\"Uvrebcu'nag Oe'b'nqpnf'g snvy'her.\"",\
"The obelisk flickers wildly, as if trying to open a gateway.", "\"Fcng'v'ny Tn'gr-jn'l snv'yher.\"")
icon_state = "obelisk_prism"
w_class = 3
@@ -220,7 +220,7 @@
if(stored_alloy + 2500 > max_alloy)
user << "<span class='warning'>[src] is too full to accept any more alloy!</span>"
return 0
user.whisper("Genafzhgr vagb jngre.")
user.whisper("Genafzhgr vagb jngr-e.")
user.visible_message("<span class='notice'>[user] liquifies [I] and pours it onto [src].</span>", \
"<span class='notice'>You liquify [src] and pour it onto [src], transferring the alloy into its reserves.</span>")
stored_alloy = stored_alloy + 2500
@@ -248,16 +248,16 @@
var/convert_attempt_cost = 150
var/convert_cost = 300
var/mania_messages = list("\"Tb ahgf.\"", "\"Gnxr n penpx ng penml.\"", "\"Znxr n ovq sbe vafnavgl.\"", "\"Trg xbbxl.\"", "\"Zbir gbjneqf znavn.\"", "\"Orpbzr orjvyqrerq.\"", "\"Jnk jvyq.\"", \
"\"Tb ebhaq gur oraq.\"", "\"Ynaq va yhanpl.\"", "\"Gel qrzragvn.\"", "\"Fgevir gb trg n fperj ybbfr.\"")
var/compel_messages = list("\"Pbzr pybfre.\"", "\"Nccebnpu gur genafzvggre.\"", "\"Gbhpu gur nagraanr.\"", "\"V nyjnlf unir gb qrny jvgu vqvbgf. Zbir gbjneqf gur znavn zbgbe.\"", \
"\"Nqinapr sbejneq naq cynpr lbhe urnq orgjrra gur nagraanr - gun'g'f nyy vg'f tbbq sbe.\"", "\"Vs lbh jrer fznegre, lbh'q or bire urer nyernql.\"", "\"Zbir SBEJNEQ, lbh sbby.\"")
var/convert_messages = list("\"Lbh jba'g qb. Tb gb fyrrc juvyr V gryy gur'fr avgjvgf ubj gb pbaireg lbh.\"", "\"Lbh ner vafhssvpvrag. V zhfg vafgehpg gur'fr vqvbgf va gur neg-bs pbairefvba.\"", \
"\"Bu-bs pbhefr, fbzrbar jr pna'g pbaireg. Gur'fr freinagf ner sbbyf.\"", "\"Ubj uneq vf vg gb hfr n Fvtvy, naljnl? Nyy vg gnxrf vf qenttvat fbzrbar bagb vg.\"", \
var/mania_messages = list("\"Tb ahgf.\"", "\"Gnxr n penpx ng penml.\"", "\"Znxr n ovq sbe vafnavgl.\"", "\"T-rg xbbxl.\"", "\"Zbir gbjneqf znavn.\"", "\"Orpbzr orjvyqrerq.\"", "\"Jnk jvyq.\"", \
"\"Tb ebhaq gur oraq.\"", "\"Ynaq va yhanpl.\"", "\"Gel qrzragv'n.\"", "\"Fgevir gb-t-rg n fperj ybbfr.\"")
var/compel_messages = list("\"Pbzr pybfre.\"", "\"Nccebnpu gur genafzvggr-e.\"", "\"Gbhpu gur nagr-aanr.\"", "\"V nyjnlf unir gb-qrny jvgu vqvbgf. Zbir gbjneqf gur znavn zbgbe.\"", \
"\"Nqinapr sbejneq-naq-cynpr lbhe urnq o-rgjrra gur nagr-aanr - gun'g'f nyy vg'f tbbq sbe.\"", "\"Vs lbh jrer fznegr-e, lbh'q or bire urer nyernql.\"", "\"Zbir SBEJNEQ, lbh sbby.\"")
var/convert_messages = list("\"Lbh jba'g qb. Tb gb-fyrrc juvyr V gr-yy gur'fr avgjvgf ubj gb-pbaireg lbh.\"", "\"Lbh ner vafhssvpvrag. V zhfg vafgehpg gur'fr vqvbgf va gur neg-bs pbairefvba.\"", \
"\"Bu-bs pbhefr, fbzrbar jr pna'g pbaireg. Gur'fr freinagf ner sbbyf.\"", "\"Ubj uneq vf vg gb-hfr n Fvtvy, naljnl? Nyy vg gnxrf vf qenttvat fbzrbar bagb vg.\"", \
"\"Ubj qb gur'l snvy gb hfr n Fvtvy-bs Npprffvba, naljnl?\"", "\"Jul vf vg gun'g nyy freinagf ner guv'f varcg?\"", "\"Vg'f dhvgr yvxryl lbh'yy or fghpx urer sbe n juvyr.\"")
var/close_messages = list("\"Jryy, lbh pna'g ernpu gur zbgbe sebz GUR'ER, lbh zbeba.\"", "\"Vagrerfgvat ybpngvba. V'q cersre vs lbh jrag fbzrjurer lbh pbhyq NPGHNYYL GBHPU GUR NAGRAANR!\"", \
"\"Nznmvat. Lbh fbzrubj znantrq gb jrqtr lbhefrys fbzrjurer lbh pna'g npghnyyl ernpu gur zbgbe sebz.\"", "\"Fhpu n fubj-bs vqvbpl vf hacnenyyryrq. Creuncf V fubhyq chg lbh ba qvfcynl?\"", \
"\"Qvq lbh qb guv'f ba checbfr? V pna'g vzntvar lbh qbvat fb nppvqragnyyl. Bu, jnvg, V pna.\"", "\"Ubj vf vg gun'g fhpu fzneg perngherf pna fgvyy qb fbzrguv'at NF FGHCVQ NF GUV'F!\"")
var/close_messages = list("\"Jryy, lbh pna'g ernpu gur zbgbe sebz GUR'ER, lbh zbeba.\"", "\"Vagr-erfgvat ybpngv'ba. V'q cersre vs lbh jrag fbzrjurer lbh pbhyq NPGHNYYL GBHPU GUR NAGR-AANR!\"", \
"\"Nznmvat. Lbh fbzrubj znantrq gb-jrqtr lbhefrys fbzrjurer lbh pna'g npghnyyl ernpu gur zbgbe sebz.\"", "\"Fhpu n fubj-bs vqvbpl vf hacnenyyryrq. Creuncf V fubhyq chg lbh ba qvfcynl?\"", \
"\"Qvq lbh qb guv'f ba checbfr? V pna'g vzntvar lbh qbvat fb nppvqragnyyl. Bu, jnvg, V pna.\"", "\"Ubj vf vg gun'g fhpu fzneg perngherf pna fgv'yy qb fbz-rguv'at NF FGHCVQ NF GUV'F!\"")
/obj/structure/clockwork/powered/mania_motor/examine(mob/user)
@@ -578,8 +578,8 @@
if(!try_use_power(hierophant_cost))
user << "<span class='warning'>The obelisk lacks the power to broadcast!</span>"
return
clockwork_say(user, "Uvrebcunag Oebnqpnfg, npgvingr!")
send_hierophant_message(user, input, "big_brass", "large_brass")
clockwork_say(user, "Uvrebcunag Oebnqpnfg, npgv'ingr!")
titled_hierophant_message(user, input, "big_brass", "large_brass")
if("Spatial Gateway")
if(gateway_active)
user << "<span class='warning'>The obelisk is already sustaining a gateway!</span>"
@@ -587,8 +587,8 @@
if(!try_use_power(gateway_cost))
user << "<span class='warning'>The obelisk lacks the power to open a gateway!</span>"
return
if(procure_gateway(user, 100, 5, 1))
clockwork_say(user, "Fcnpvny Tngrjnl, npgvingr!")
if(procure_gateway(user, 100, 5, 1) && !gateway_active)
clockwork_say(user, "Fcngv'ny Tngrjnl, npgv'ingr!")
else
return_power(gateway_cost)
if("Cancel")
+9 -12
View File
@@ -40,9 +40,7 @@
SSshuttle.emergencyNoEscape = TRUE
START_PROCESSING(SSobj, src)
var/area/gate_area = get_area(src)
for(var/M in mob_list)
if(is_servant_of_ratvar(M) || isobserver(M))
M << "<span class='large_brass'><b>A gateway to the Celestial Derelict has been created in [gate_area.map_name]!</b></span>"
hierophant_message("<span class='large_brass'><b>A gateway to the Celestial Derelict has been created in [gate_area.map_name]!</b></span>")
/obj/structure/clockwork/massive/celestial_gateway/Destroy()
SSshuttle.emergencyNoEscape = FALSE
@@ -54,9 +52,7 @@
STOP_PROCESSING(SSobj, src)
if(!purpose_fulfilled)
var/area/gate_area = get_area(src)
for(var/M in mob_list)
if(is_servant_of_ratvar(M) || isobserver(M))
M << "<span class='large_brass'><b>A gateway to the Celestial Derelict has fallen at [gate_area.map_name]!</b></span>"
hierophant_message("<span class='large_brass'><b>A gateway to the Celestial Derelict has fallen at [gate_area.map_name]!</b></span>")
world << sound(null, 0, channel = 8)
qdel(glow)
glow = null
@@ -85,7 +81,7 @@
return 0 //Nice try, Toxins!
/obj/structure/clockwork/massive/celestial_gateway/process()
if(!progress_in_seconds || prob(5))
if(!progress_in_seconds || prob(7))
for(var/M in mob_list)
M << "<span class='warning'><b>You hear otherworldly sounds from the [dir2text(get_dir(get_turf(M), get_turf(src)))]...</span>"
if(!health)
@@ -116,9 +112,9 @@
takes_damage = FALSE
purpose_fulfilled = TRUE
make_glow()
animate(glow, transform = matrix() * 1.5, alpha = 255, time = 126)
animate(glow, transform = matrix() * 1.5, alpha = 255, time = 125)
world << sound('sound/effects/ratvar_rises.ogg', 0, channel = 8) //End the sounds
sleep(126)
sleep(125)
make_glow()
animate(glow, transform = matrix() * 3, alpha = 0, time = 5)
sleep(5)
@@ -192,7 +188,7 @@
for(var/obj/item/clockwork/ratvarian_spear/R in all_clockwork_objects)
R.update_force()
START_PROCESSING(SSobj, src)
world << "<span class='heavy_brass'><font size=6>\"BAPR NTNVA ZL YVTUG FUNYY FUVAR NPEBFF GUVF CNGURGVP ERNYZ!!\"</font></span>"
world << "<span class='heavy_brass'><font size=6>\"BAPR NTNVA ZL-YVTUG FUNYY FUVAR NPEBFF GUV'F CNGU-RGV'P ERNYZ!!\"</font></span>"
world << 'sound/effects/ratvar_reveal.ogg'
var/image/alert_overlay = image('icons/effects/clockwork_effects.dmi', "ratvar_alert")
var/area/A = get_area(src)
@@ -288,10 +284,11 @@
spawn(1)
M.client.color = initial(M.client.color)
shake_camera(M, 4, 3)
var/r_success_modifier = (ticker.mode.servants_of_ratvar.len * 2) //2% for each cultist
var/n_success_modifier = (ticker.mode.cult.len * 2)
var/r_success_modifier = min(ticker.mode.servants_of_ratvar.len * 2, 50) //2% for each cultist
var/n_success_modifier = ticker.mode.cult.len * 2
for(var/mob/living/simple_animal/hostile/construct/harvester/C in player_list)
n_success_modifier += 2
n_success_modifier = min(n_success_modifier, 50)
if(prob(base_victory_chance + r_success_modifier))
winner = "Ratvar"
break
@@ -76,7 +76,8 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/proc/has_requirements() //if we have the components and invokers to do it
if(!ratvar_awakens && !slab.no_cost)
for(var/i in required_components)
if(slab.stored_components[i] + clockwork_component_cache[i] < required_components[i])
var/cache_components = clockwork_caches ? clockwork_component_cache[i] : 0
if(slab.stored_components[i] + cache_components < required_components[i])
invoker << "<span class='warning'>You lack the components to recite this piece of scripture! Check Recollection for component costs.</span>"
return 0
if(multiple_invokers_used && !multiple_invokers_optional && !ratvar_awakens && !slab.no_cost)
@@ -178,7 +179,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Channeled, Area Slowdown"
name = "Belligerent"
desc = "Forces all nearby non-servants to walk rather than run. Chanted every three seconds for up to thirty seconds."
chant_invocations = list("Chav'fu gurve oyva-qarff!") //"Punish their blindness!"
chant_invocations = list("Chavfu gur've oyvaqarff!") //"Punish their blindness!"
chant_amount = 10
chant_interval = 30
required_components = list("belligerent_eye" = 1)
@@ -201,9 +202,9 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/create_object/judicial_visor //Judicial Visor: Creates a judicial visor.
descname = "Delayed Area Stun Glasses"
name = "Judicial Visor"
desc = "Forms a visor that, when worn, will grant the ability to form a flame in your hand that can be activated at an area to smite it, stunning and damaging the nonfaithful. \
desc = "Forms a visor that, when worn, will grant the ability to form a flame in your hand that can be activated at an area to smite it, stunning, muting, and damaging the nonfaithful. \
Cultists of Nar-Sie will be set on fire, though they will be stunned for half the time."
invocations = list("Tenag zr gur synzrf-bs Ratvar!")
invocations = list("Tenag-zr gur synzrf-bs Ratvar!")
channel_time = 10
required_components = list("belligerent_eye" = 2)
consumed_components = list("belligerent_eye" = 1)
@@ -296,7 +297,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Melee Area Convert"
name = "Guvax"
desc = "Enlists all nearby living unshielded creatures into servitude to Ratvar. Also purges holy water from nearby servants."
invocations = list("Rayvtugra guvf urngura!", "Nyy ner vafrpgf orsber Ratvar!", "Chetr nyy hageh'guf naq ubabe Ratvar.")
invocations = list("Rayvtugr-a guv'f urngura!", "Nyy ner vafrpgf orsber Ratvar!", "Chetr nyy hagehguf-naq-ubabe Ratvar.")
channel_time = 50
required_components = list("guvax_capacitor" = 1)
usage_tip = "Only works on those in melee range and does not penetrate mindshield implants. Much more efficient than a Sigil of Submission."
@@ -332,7 +333,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Channeled, Mobile Area Confusion"
name = "Taunting Tirade"
desc = "Confuses and dizzies all nearby non-servants with a short invocation, then allows movement for three seconds. Chanted every second for up to thirty-five seconds."
chant_invocations = list("Ubfgvyrf ba zl onpx!", "Rarzvrf ba zl genvy!", "Tbaan gel naq funxr zl gnvy.", "Obtrlf ba zl fvk!")
chant_invocations = list("Ubfgv'yrf ba zl-onpx!", "Rarzvrf ba zl-genvy!", "Tbaan gel-naq-funxr zl-gnvy.", "Obtrlf ba zl-fvk!")
chant_amount = 10
chant_interval = 5
required_components = list("guvax_capacitor" = 2)
@@ -372,7 +373,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "New Clockwork Slab"
name = "Replicant"
desc = "Creates a new clockwork slab."
invocations = list("Z`rgny, orpbzr terngre!")
invocations = list("Z-rgny, orpbzr terngr-e!")
channel_time = 0
required_components = list("replicant_alloy" = 1)
whispered = TRUE
@@ -391,7 +392,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Necessary, Shares Components"
name = "Tinkerer's Cache"
desc = "Forms a cache that can store an infinite amount of components. All caches are linked and will provide components to slabs."
invocations = list("Ohvyqva...", "...n qvfcrafre!")
invocations = list("Pbafgehpgv'at...", "...n pnpur!")
channel_time = 50
required_components = list("replicant_alloy" = 2)
consumed_components = list("replicant_alloy" = 1)
@@ -408,7 +409,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Xray Vision Glasses"
name = "Wraith Spectacles"
desc = "Fabricates a pair of glasses that provides true sight but quickly damage vision, eventually causing blindness if worn for too long."
invocations = list("Y'vsg gur fpnyrf sebz zl rl-rf.")
invocations = list("Fubj gur gehgu-bs guv'f jbeyq gb-zr!")
channel_time = 10
required_components = list("hierophant_ansible" = 1)
whispered = TRUE
@@ -423,7 +424,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Stun Trap"
name = "Sigil of Transgression"
desc = "Wards a tile with a sigil. The next person to cross the sigil will be smitten and unable to move. Nar-Sian cultists are stunned altogether."
invocations = list("Qvivavgl, qnmmyr...", "...gubfr jub gerffcnff'urer!") //"Divinity, dazzle those who trespass here!"
invocations = list("Qvivavgl, qnmmyr...", "...gub'fr jub gerffcnff urer!") //"Divinity, dazzle those who trespass here!"
channel_time = 50
required_components = list("hierophant_ansible" = 2)
consumed_components = list("hierophant_ansible" = 1)
@@ -442,7 +443,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Turret"
name = "Ocular Warden"
desc = "Forms an automatic short-range turret that deals low sustained damage to the unenlightened in its range."
invocations = list("Thneqvnaf...", "...bs gur Ratvar...", "...qrsraq!")
invocations = list("Thneqvnaf...", "...bs gur Ratvar...", "...qrsraq hf!")
channel_time = 120
required_components = list("belligerent_eye" = 2, "replicant_alloy" = 1)
consumed_components = list("belligerent_eye" = 1, "replicant_alloy" = 1)
@@ -464,7 +465,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Channeled, Area Power Drain"
name = "Volt Void" //Alternative name: "On all levels but physical, I am a power sink"
desc = "Drains energy from nearby power sources, dealing burn damage if the total power consumed is above a threshhold. Channeled every second for a maximum of thirty seconds."
chant_invocations = list("Qenj punetr gb guvf furyy!")
chant_invocations = list("Qenj punetr gb-guv'f furyy!")
chant_amount = 30
chant_interval = 10
required_components = list("guvax_capacitor" = 1, "hierophant_ansible" = 2)
@@ -551,7 +552,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Necessary, Converts Objects"
name = "Clockwork Proselytizer"
desc = "Forms a device that, when used on certain objects, converts them into their Ratvarian equivalents. It requires replicant alloys to function."
invocations = list("Jvgu guvf qrivpr...", "...uvf cerfrapr funyy or znqr xabja.")
invocations = list("Jvgu guv'f qrivpr...", "...uvf cerfrapr funyy or-znqr xabja.")
channel_time = 20
required_components = list("guvax_capacitor" = 1, "replicant_alloy" = 2)
consumed_components = list("guvax_capacitor" = 1, "replicant_alloy" = 1)
@@ -568,7 +569,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
name = "Fellowship Armory"
desc = "Equips the invoker and any nearby servants with Ratvarian armor. This armor provides high melee resistance but a weakness to lasers. \
It grows faster to invoke with more nearby servants."
invocations = list("Fuvryq zr...", "...jvgu gur sentzragf...", "...bs Ratvar!")
invocations = list("Fuvryq zr...", "...jvgu gur...", "... sentzragf-bs Ratvar!")
channel_time = 110 //effectively 100 because it counts the invoker
required_components = list("vanguard_cogwheel" = 2, "replicant_alloy" = 1)
consumed_components = list("vanguard_cogwheel" = 1, "replicant_alloy" = 1)
@@ -629,7 +630,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
name = "Spatial Gateway"
desc = "Tears open a miniaturized gateway in spacetime to any conscious servant that can transport objects or creatures to its destination. \
Each servant assisting in the invocation adds one additional use and four additional seconds to the gateway's uses and duration."
invocations = list("Gryrcbegre...", "...pbzva evtug-hc!")
invocations = list("Fcngv'ny Tngr-jnl...", "...npgv'ingr!")
channel_time = 80
required_components = list("vanguard_cogwheel" = 1, "hierophant_ansible" = 2)
consumed_components = list("vanguard_cogwheel" = 1, "hierophant_ansible" = 1)
@@ -671,7 +672,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Clockwork Posibrain"
name = "Soul Vessel"
desc = "Forms an ancient positronic brain with an overriding directive to serve Ratvar."
invocations = list("Ureq'gur fbhyf-bs...", "...gur oynf curz-bhf qnzarq!")
invocations = list("Ureq gur fbhyf-bs...", "...gur oynfcurzbhf qnzarq!")
channel_time = 20
required_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 2)
consumed_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 1)
@@ -703,7 +704,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Conversion Trap"
name = "Sigil of Submission"
desc = "Places a luminous sigil that will enslave any valid beings standing on it after a time."
invocations = list("Qvivavgl, rayvtugra...", "...gubfr jub gerfcnff urer!")
invocations = list("Qvivavgl, rayvtugr-a...", "...gub'fr-jub gerfcnff urer!")
channel_time = 60
required_components = list("belligerent_eye" = 1, "guvax_capacitor" = 2)
consumed_components = list("belligerent_eye" = 1, "guvax_capacitor" = 1)
@@ -759,7 +760,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Structure Battery"
name = "Sigil of Transmission"
desc = "Scribes a sigil beneath the invoker which stores power to power clockwork structures."
invocations = list("Qvivavgl...", "punetr gur-znpuvarf!")
invocations = list("Qvivavgl...", "...cbjre bhe perngv'baf!")
channel_time = 70
required_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 1, "hierophant_ansible" = 3)
consumed_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 1, "hierophant_ansible" = 2)
@@ -777,7 +778,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
name = "Vitality Matrix"
desc = "Scribes a sigil beneath the invoker which drains life from any living non-servants that cross it. Servants that cross it, however, will be healed based on how much it drained from non-servants. \
Dead servants can be revived by this sigil if it has enough stored vitality."
invocations = list("Qvivavgl...", "fgrny gur've yvsr...", "sbe guv'f furyy!")
invocations = list("Qvivavgl...", "...fgr-ny gur've yvsr...", "...sbe gur'fr furyyf!")
channel_time = 70
required_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 3, "hierophant_ansible" = 1)
consumed_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 2, "hierophant_ansible" = 1)
@@ -796,7 +797,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
called forth by Speaking its True Name or if you become exceptionally low on health.<br> \
Unlike holoparasites, however, it does not transfer the damage it takes to you, instead simply gaining Fatigue as it is attacked. Marauders cannot move too far from their hosts, \
and will gain Fatigue at an increasing rate as they grow farther away. At maximum Fatigue, the marauder is forced to return to you and will be unable to manifest until its Fatigue is at zero."
invocations = list("Pnyy sbegu...", "Sevtug'f jvyy, gur zvaq znqr fjbeq-naq-fuvryq.")
invocations = list("Sevtug'f jvyy...", "...pnyy sbegu...")
channel_time = 100
required_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 1, "guvax_capacitor" = 3)
consumed_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 1, "guvax_capacitor" = 2)
@@ -827,6 +828,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
invoker.apply_damage(10, BRUTE, "head")
slab.busy = null
return 0
clockwork_say(invoker, "...gur zvaq znqr...")
invoker.notransform = FALSE
slab.busy = null
if(!check_special_requirements())
@@ -839,6 +841,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
invoker.visible_message("<span class='warning'>The tendril retracts from [invoker]'s head, sealing the entry wound as it does so!</span>", \
"<span class='warning'>The tendril was unsuccessful! Perhaps you should try again another time.</span>")
return 0
clockwork_say(invoker, "...fjbeq-naq-fuvryq!")
var/mob/dead/observer/theghost = pick(marauder_candidates)
var/mob/living/simple_animal/hostile/clockwork/marauder/M = new(invoker)
M.key = theghost.key
@@ -858,7 +861,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Structure, Disables Machinery"
name = "Interdiction Lens"
desc = "Creates a clockwork totem that sabotages nearby machinery and funnels drained power into nearby Sigils of Transmission."
invocations = list("Znl guvf gbgrz...", "...fuebhq gur snyfr fhaf!")
invocations = list("Znl guv'f gbgr-z...", "...fuebhq gur snyfr fhaf!")
channel_time = 80
required_components = list("belligerent_eye" = 1, "replicant_alloy" = 4, "hierophant_ansible" = 1)
consumed_components = list("belligerent_eye" = 1, "replicant_alloy" = 3, "hierophant_ansible" = 1)
@@ -877,7 +880,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Structure, Repairs Other Structures"
name = "Mending Motor"
desc = "Creates a mechanized prism that will rapidly repair damage to clockwork creatures, converted cyborgs, and clockwork structures. Requires replicant alloy or power to function."
invocations = list("Znl guvf cevfz...", "...zraq bhe qragf naq fpengpurf!")
invocations = list("Znl guv'f cevfz...", "...zraq bhe qragf-naq-fpengpurf!")
channel_time = 80
required_components = list("vanguard_cogwheel" = 4, "guvax_capacitor" = 1, "replicant_alloy" = 1)
consumed_components = list("vanguard_cogwheel" = 3, "guvax_capacitor" = 1, "replicant_alloy" = 1)
@@ -896,7 +899,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Structure, Teleportation Hub"
name = "Clockwork Obelisk"
desc = "Creates a clockwork obelisk that can broadcast messages over the Hierophant Network or open a Spatial Gateway to any living servant or clockwork obelisk."
invocations = list("Znl guvf boryvfx...", "...gnxr hf gb nyy cynprf!")
invocations = list("Znl guv'f boryvfx...", "...gnxr hf gb-nyy cynprf!")
channel_time = 80
required_components = list("vanguard_cogwheel" = 1, "replicant_alloy" = 1, "hierophant_ansible" = 4)
consumed_components = list("vanguard_cogwheel" = 1, "replicant_alloy" = 1, "hierophant_ansible" = 3)
@@ -915,7 +918,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Structure, Area Denial"
name = "Mania Motor"
desc = "Creates a mania motor which will cause brain damage and hallucinations in nearby non-servant humans. It will also try to convert humans directly adjecent to the motor."
invocations = list("Znl guvf genafzvggre...", "...oernx gur jvyy bs nyy jub bccbfr hf!")
invocations = list("Znl guv'f genafzvggr-e...", "...oernx gur jvyy-bs nyy jub bccbfr hf!")
channel_time = 80
required_components = list("guvax_capacitor" = 4, "replicant_alloy" = 1, "hierophant_ansible" = 1)
consumed_components = list("guvax_capacitor" = 3, "replicant_alloy" = 1, "hierophant_ansible" = 1)
@@ -934,7 +937,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Component Generator"
name = "Tinkerer's Daemon"
desc = "Forms a daemon shell that can be attached to a tinkerer's cache to add new components at a healthy rate. It will only function if it is outnumbered by servants in a ratio of 5:1."
invocations = list("Pbaf'gehpg Ratvar cnegf...", "...gun'g lrg ubyq terngarff!")
invocations = list("Pbyyrpg Ratvar cnegf...", "...gun'g l-rg ubyq terngarff!")
channel_time = 80
required_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 3)
consumed_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 1, "guvax_capacitor" = 1, "replicant_alloy" = 1, "hierophant_ansible" = 1)
@@ -966,7 +969,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
name = "Invoke Nezbere, the Brass Eidolon"
desc = "Taps the limitless power of Nezbere, one of Ratvar's four generals. The restless toil of the Eidolon will empower a wide variety of clockwork apparatus for a full minute - notably, \
clockwork proselytizers will cost no replicant alloy to use."
invocations = list("V pnyy hcba lbh, Nezbere!!", "Yrg lbhe znpuv'angvbaf ervta ba guvf zvfrenoyr fgng'vba!!", "Yrg lbhe cbjre sybj gueb-htu gur gbbyf bs lbhe znfgre!!")
invocations = list("V pnyy hcba lbh, Nezbere!!", "Y-rg lbhe znpuvangv'baf ervta ba guv'f zvfrenoyr fgngv'ba!!", "Y-rg lbhe cbjre sybj gue'bhtu gur gbbyf bs lbhe znfgr-e!!")
channel_time = 150
required_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 6)
consumed_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 6)
@@ -976,18 +979,18 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/invoke_nezbere/check_special_requirements()
if(!slab.no_cost && clockwork_generals_invoked["nezbere"] > world.time)
invoker << "<span class='nezbere'>\"Abg whfg lrg, sevraq. Cngvrapr vf n iveghr.\"</span>\n\
invoker << "<span class='nezbere'>\"Abg whfg l-rg, sevraq. Cngv'rapr vf n iveghr.\"</span>\n\
<span class='warning'>Nezbere has already been invoked recently! You must wait several minutes before calling upon the Brass Eidolon.</span>"
return 0
if(!slab.no_cost && ratvar_awakens)
invoker << "<span class='nezbere'>\"Bhe znfgre vf urer nyernql. Lbh qb abg erdhver zl uryc, sevraq.\"</span>\n\
invoker << "<span class='nezbere'>\"Bhe znfgr-e vf urer nyernql. Lbh qb abg erdhver zl-uryc, sevraq.\"</span>\n\
<span class='warning'>Nezbere will not grant his power while Ratvar's dwarfs his own!</span>"
return 0
return 1
/datum/clockwork_scripture/invoke_nezbere/scripture_effects()
var/obj/effect/clockwork/general_marker/nezbere/N = new(get_turf(invoker))
N.visible_message("<span class='nezbere'>\"V urrq lbhe pnyy, punz'cvbaf. Znl lbhe negvs-npgf oevat ehva hcba gur urnguraf gung bccbfr bhe znfgre!\"</span>")
N.visible_message("<span class='nezbere'>\"V urrq lbhe pnyy, punzcvbaf. Znl lbhe negv'snpgf oevat ehva hcba gur urngur'af gun'g bccbfr bhe znfgr-e!\"</span>")
clockwork_generals_invoked["nezbere"] = world.time + CLOCKWORK_GENERAL_COOLDOWN
for(var/obj/structure/clockwork/ocular_warden/W in all_clockwork_objects) //Ocular wardens have increased damage and radius
W.damage_per_tick *= 1.5
@@ -1017,23 +1020,23 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
name = "Invoke Sevtug, the Formless Pariah"
desc = "Taps the limitless power of Sevtug, one of Ratvar's four generals. The mental manipulation ability of the Pariah allows its wielder to cause mass hallucinations and confusion \
for all non-servant humans on the same z-level as them. The power of this scripture falls off somewhat with distance, and certain things may reduce its effects."
invocations = list("V pnyy hcba lbh, Sevtug!!", "Yrg lbhe cbjre fung-gre gur fnavgl bs gur jrnx-zvaqrq!!", "Yrg lbhe graqevyf ubyq fjnl bire nyy!!")
invocations = list("V pnyy hcba lbh, Sevtug!!", "Y-rg lbhe cbjre funggr-e gur fnavgl-bs gur jrnx-zvaqrq!!", "Y-rg lbhe graqevyf ubyq fjnl bire nyy!!")
channel_time = 150
required_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 6, "hierophant_ansible" = 3)
consumed_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 6, "hierophant_ansible" = 3)
usage_tip = "Causes brain damage, hallucinations, confusion, and dizziness in massive amounts."
tier = SCRIPTURE_REVENANT
var/list/mindbreaksayings = list("\"Bu, terng. V trg gb funggre fbzr zvaqf.\"", "\"Zber zvaqf gb pehfu.\"", \
"\"Ernyyl, guvf vf nyzbfg obevat.\"", "\"Abar-bs gur'fr zvaqf unir nalguvat vagrerfgvat va gur'z.\"", "\"Znlor V pna vafgvyy n yvggyr ovg bs greebe va guv'f bar.\"", \
"\"Jung n jnfgr-bs zl cbjre.\"", "\"V'z fher V pbhyq whfg pbageby gur'fr zvaqf vafgrnq, ohg gur'l arire nfx.\"")
var/list/mindbreaksayings = list("\"Bu, terng. V t-rg gb funggr-e fbzr zvaqf.\"", "\"Zber zvaqf gb-pehfu.\"", \
"\"Ernyyl, guv'f vf nyzbfg obevat.\"", "\"Abar-bs gur'fr zvaqf unir nalguv'at vagr-erfgvat va gur'z.\"", "\"Znlor V pna vafgv'yy n yvggyr ovg-bs gr-eebe va guv'f bar.\"", \
"\"Jung n jnfgr-bs zl-cbjre.\"", "\"V'z fher V pbhyq whfg pbageby gur'fr zvaqf vafgr-nq, ohg gur'l arire nfx.\"")
/datum/clockwork_scripture/invoke_sevtug/check_special_requirements()
if(!slab.no_cost && clockwork_generals_invoked["sevtug"] > world.time)
invoker << "<span class='sevtug'>\"Vf vg ernyyl fb uneq - rira sbe n fvzcyrgba yvxr lbh - gb tenfc gur pbaprcg bs jnvgvat?\"</span>\n\
invoker << "<span class='sevtug'>\"Vf vg ernyyl fb uneq - rira sbe n fvzcy-rgba yvxr lbh - gb-tenfc gur pbaprcg-bs jnvgv'at?\"</span>\n\
<span class='warning'>Sevtug has already been invoked recently! You must wait several minutes before calling upon the Formless Pariah.</span>"
return 0
if(!slab.no_cost && ratvar_awakens)
invoker << "<span class='sevtug'>\"Qb lbh ernyyl guvax nalguvat V pna qb evtug abj jvyy pbzcner gb Ratvar's cbjre?.\"</span>\n\
invoker << "<span class='sevtug'>\"Qb lbh ernyyl guv'ax nalguv'at V pna qb evtug abj jvyy pbzcner gb-Ratvar's cbjre?.\"</span>\n\
<span class='warning'>Sevtug will not grant his power while Ratvar's dwarfs his own!</span>"
return 0
return ..()
@@ -1055,7 +1058,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
visualsdistance = round(visualsdistance * 0.25)
minordistance = round(minordistance * 0.25)
majordistance = round(majordistance * 0.25)
H << "<span class='sevtug'>Bu, n ibvq jrncba. Ubj naablvat, V znl nf jryy abg obgure.</span>\n\
H << "<span class='sevtug'>Bu, n ibvq jrncba. Ubj naablvat, V znl nf jryy abg obgur'e.</span>\n\
<span class='warning'>Your holy weapon glows a faint orange in an attempt to defend your mind!</span>"
messaged = TRUE
if(isloyal(H))
@@ -1083,7 +1086,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
name = "Invoke Nzcrentr, the Forgotten Arbiter"
desc = "Taps the limitless power of Nzcrentr, one of Ratvar's four generals. The immense energy Nzcrentr wields will allow you to imbue a tiny fraction of it into your body. After several \
seconds, anyone nearby will be struck by a devastating lightning bolt."
invocations = list("V pnyy hcba lbh, Nzcrentr!!", "Yrg lbhe raretl sybj guebhtu zr!!", "Yrg lbhe obhaq-yrff cbjre fung-gre fgnef!!")
invocations = list("V pnyy hcba lbh, Nzcrentr!!", "Y-rg lbhe raretl sybj gue'bhtu zr!!", "Y-rg lbhe obhaqyrff-cbjre funggr-e fgnef!!")
channel_time = 150
required_components = list("belligerent_eye" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 6)
consumed_components = list("belligerent_eye" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 6)
@@ -1092,7 +1095,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/invoke_nzcrentr/check_special_requirements()
if(!slab.no_cost && clockwork_generals_invoked["nzcrentr"] > world.time)
invoker << "<span class='nzcrentr'><b><i>\"Gur obff fnlf lbh unir gb jnvg. Url, qb lbh guvax ur jbhyq zvaq vs v xvyyrq lbh? ...Ur jbhyq? Bx.\"</b></i></span>\n\
invoker << "<span class='nzcrentr'>\"Gur obff fnlf lbh unir gb-jnvg. Url, qb lbh guv'ax ur jbhyq zvaq vs V xvyyrq lbh? ...Ur jbhyq? Bx.\"</span>\n\
<span class='warning'>Nzcrentr has already been invoked recently! You must wait several minutes before calling upon the Forgotten Arbiter.</span>"
return 0
return 1
@@ -1101,14 +1104,14 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
new/obj/effect/clockwork/general_marker/nzcrentr(get_turf(invoker))
clockwork_generals_invoked["nzcrentr"] = world.time + CLOCKWORK_GENERAL_COOLDOWN
invoker.visible_message("<span class='warning'>[invoker] begins to radiate a blinding light!</span>", \
"<span class='nzcrentr'>\"Gur obff fnlf vg'f bxnl gb qb guv'f. Qba'g oynzr zr vs lbh qvr sebz vg.\"</span>\n \
"<span class='nzcrentr'>\"Gur obff fnlf vg'f bxnl gb-qb guv'f. Qba'g oynzr zr vs lbh qvr sebz vg.\"</span>\n \
<span class='userdanger'>You feel limitless power surging through you!</span>")
playsound(invoker, 'sound/magic/lightning_chargeup.ogg', 100, 0)
animate(invoker, color = list(rgb(255, 255, 255), rgb(255, 255, 255), rgb(255, 255, 255), rgb(0,0,0)), time = 88) //Gradual advancement to extreme brightness
sleep(88)
if(invoker)
invoker.visible_message("<span class='warning'>Massive bolts of energy emerge from across [invoker]'s body!</span>", \
"<span class='nzcrentr'>\"V gbyq lbh lbh jbhyqa'g or noyr gb unaqyr vg.\"</span>\n \
"<span class='nzcrentr'>\"V gbyq lbh lbh jbhyqa'g or noyr gb-unaqyr vg.\"</span>\n \
<span class='userdanger'>TOO... MUCH! CAN'T... TAKE IT!</span>")
playsound(invoker, 'sound/magic/lightningbolt.ogg', 100, 0)
animate(invoker, color = initial(invoker.color), time = 10)
@@ -1138,7 +1141,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Area Invuln"
name = "Invoke Inath-Neq, the Resonant Cogwheel"
desc = "Taps the limitless power of Inath-Neq, one of Ratvar's four generals. The benevolence of Inath-Neq will grant complete invulnerability to all servants in range for fifteen seconds."
invocations = list("V pnyy hcba lbh, Inath-Neq!!", "Yrg gur Erfbanag Pbtf ghea bapr zber!!", "Tenag zr naq zl nyyvrf gur fgeratgu gb inadhvfu bhe sbrf!!")
invocations = list("V pnyy hcba lbh, Inath-Neq!!", "Y-rg gur Erfbanag Pbtf ghea bapr zber!!", "Tenag zr-naq-zl-nyyvrf gur fgeratgu gb-inadhvfu bhe sbrf!!")
channel_time = 150
required_components = list("vanguard_cogwheel" = 6, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 3)
consumed_components = list("vanguard_cogwheel" = 6, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 3)
@@ -1147,7 +1150,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/invoke_inathneq/check_special_requirements()
if(!slab.no_cost && clockwork_generals_invoked["inath-neq"] > world.time)
invoker << "<span class='inathneq'>\"V pnaabg yraq lbh zl nvq lrg, punzcvba. Cyrnfr or pnershy.\"</span>\n\
invoker << "<span class='inathneq'>\"V pnaabg yraq lbh zl-nvq l-rg, punzcvba. Cyrnfr or pnershy.\"</span>\n\
<span class='warning'>Inath-Neq has already been invoked recently! You must wait several minutes before calling upon the Resonant Cogwheel.</span>"
return 0
return 1
@@ -1161,7 +1164,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
for(var/mob/living/L in range(7, invoker))
if(!is_servant_of_ratvar(L) || L.stat == DEAD)
continue
L << "<span class='inathneq'>\"V yraq lbh zl nvq, punzcvba! Yrg tybel thvqr lbhe oybjf!\"</span>\n\
L << "<span class='inathneq'>\"V yraq lbh zl-nvq, punzcvba! Y-rg tybel thvqr lbhe oybjf!\"</span>\n\
<span class='notice'>Inath-Neq's power flows through you!</span>"
L.color = "#1E8CE1"
L.fully_heal()
@@ -1184,7 +1187,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
desc = "Pulls from the power of all of Ratvar's servants and generals to construct a massive machine used to tear apart a rift in spacetime to the Celestial Derelict. This gateway will \
call forth Ratvar from his exile after some time."
invocations = list("NEZBERE! SEVTUG! NZCRENTR! INATH-NEQ! V PNYY HCBA LBH!!", \
"GUR GVZR UNF PBZR SBE BHE ZNFGRE GB OERNX GUR PUNVAF BS RKVYR!!", \
"GUR GV'ZR UNF PBZR SBE BHE ZNFGR-E GB-OERNX GUR PUNVAF-BS RKVYR!!", \
"YRAQ HF LBHE NVQ! RATVAR PBZRF!!")
channel_time = 150
required_components = list("belligerent_eye" = 10, "vanguard_cogwheel" = 10, "guvax_capacitor" = 10, "replicant_alloy" = 10, "hierophant_ansible" = 10)
@@ -1214,33 +1217,35 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/scripture_effects()
var/turf/T = get_turf(invoker)
new/obj/effect/clockwork/general_marker/nezbere(T)
T.visible_message("<span class='nezbere'>\"Ratvar, pbzr sbegu naq fuvar lbhe yvtug npebff guvf ernyz!\"</span>")
playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 20, 0)
new/obj/effect/clockwork/general_marker/inathneq(T)
T.visible_message("<span class='inathneq'>\"Ratvar, pbzr sbegu-naq-fubj lbhe freinagf lbhe zrepl!\"</span>")
playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 30, 0)
sleep(10)
new/obj/effect/clockwork/general_marker/sevtug(T)
T.visible_message("<span class='sevtug'>\"Ratvar, pbzr sbegu naq fubj guvf fgngvba lbhe qrpbengvat fxvyyf!\"</span>")
playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 30, 0)
T.visible_message("<span class='sevtug'>\"Ratvar, pbzr sbegu-naq-fubj guv'f fgngv'ba lbhe qrpbengv'at fxvyyf!\"</span>")
playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 45, 0)
sleep(10)
new/obj/effect/clockwork/general_marker/nezbere(T)
T.visible_message("<span class='nezbere'>\"Ratvar, pbzr sbegu-naq-fuvar lbhe yvtug npebff guv'f ernyz!\"</span>")
playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 60, 0)
sleep(10)
new/obj/effect/clockwork/general_marker/nzcrentr(T)
T.visible_message("<span class='nzcrentr'>\"Ratvar, pbzr sbegu.\"</span>")
playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 40, 0)
playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 75, 0)
sleep(10)
new/obj/effect/clockwork/general_marker/inathneq(T)
T.visible_message("<span class='inathneq'>\"Ratvar, pbzr sbegu naq fubj lbhe freinagf lbhe zrepl!\"</span>")
playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 50, 0)
sleep(10)
new/obj/structure/clockwork/massive/celestial_gateway(T)
playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 100, 0)
var/list/open_turfs = list()
for(var/turf/open/OT in orange(1, T))
var/list/dense_objects = list()
for(var/obj/O in OT)
if(O.density && !O.CanPass(invoker, OT, 5))
dense_objects |= O
if(!dense_objects.len)
open_turfs |= OT
if(open_turfs.len)
for(var/mob/living/L in T)
L.forceMove(pick(open_turfs)) //shove living mobs off of the gate's new location
return 1
if(check_special_requirements())
new/obj/structure/clockwork/massive/celestial_gateway(T)
playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 100, 0)
var/list/open_turfs = list()
for(var/turf/open/OT in orange(1, T))
var/list/dense_objects = list()
for(var/obj/O in OT)
if(O.density && !O.CanPass(invoker, OT, 5))
dense_objects |= O
if(!dense_objects.len)
open_turfs |= OT
if(open_turfs.len)
for(var/mob/living/L in T)
L.forceMove(pick(open_turfs)) //shove living mobs off of the gate's new location
return 1
return 0
@@ -24,11 +24,11 @@
/obj/structure/clockwork/New()
..()
clockwork_construction_value += construction_value
change_construction_value(construction_value)
all_clockwork_objects += src
/obj/structure/clockwork/Destroy()
clockwork_construction_value -= construction_value
change_construction_value(-construction_value)
all_clockwork_objects -= src
return ..()
@@ -155,11 +155,15 @@
/obj/structure/clockwork/cache/New()
..()
START_PROCESSING(SSobj, src)
var/list/scripture_states = get_scripture_states()
clockwork_caches++
scripture_unlock_alert(scripture_states)
SetLuminosity(2,1)
/obj/structure/clockwork/cache/Destroy()
var/list/scripture_states = get_scripture_states()
clockwork_caches--
scripture_unlock_alert(scripture_states)
STOP_PROCESSING(SSobj, src)
return ..()
@@ -526,8 +530,12 @@
L.Weaken(4) //half the stun, but sets cultists on fire
L.adjust_fire_stacks(2)
L.IgniteMob()
if(iscarbon(L))
var/mob/living/carbon/C = L
C.silent += 6
targetsjudged++
L.adjustBruteLoss(10)
add_logs(user, L, "struck with a judicial blast")
user << "<span class='brass'><b>[targetsjudged ? "Successfully judged <span class='neovgre'>[targetsjudged]</span>":"Judged no"] heretic[!targetsjudged || targetsjudged > 1 ? "s":""].</b></span>"
QDEL_IN(src, 3) //so the animation completes properly
@@ -1,16 +1,25 @@
//sends messages via hierophant
/proc/send_hierophant_message(mob/user, message, name_span = "heavy_brass", message_span = "brass", user_title = "Servant")
/proc/titled_hierophant_message(mob/user, message, name_span = "heavy_brass", message_span = "brass", user_title = "Servant")
if(!user || !message || !ticker || !ticker.mode)
return 0
var/parsed_message = "<span class='[name_span]'>[user_title ? "[user_title] ":""][findtextEx(user.name, user.real_name) ? user.name : "[user.real_name] (as [user.name])"]: </span><span class='[message_span]'>\"[message]\"</span>"
for(var/M in mob_list)
if(isobserver(M))
var/link = FOLLOW_LINK(M, user)
M << "[link] [parsed_message]"
else if(is_servant_of_ratvar(M))
M << parsed_message
var/parsed_message = "<span class='[name_span]'>[user_title ? "[user_title] ":""][findtextEx(user.name, user.real_name) ? user.name : "[user.real_name] (as [user.name])"]: \
</span><span class='[message_span]'>\"[message]\"</span>"
hierophant_message(parsed_message, FALSE, user)
return 1
/proc/hierophant_message(message, servantsonly, atom/target) //sends a generic message to all servants and optionally observers
if(!message || !ticker || !ticker.mode)
return 0
for(var/M in mob_list)
if(!servantsonly && isobserver(M))
if(target)
var/link = FOLLOW_LINK(M, target)
M << "[link] [message]"
else
M << message
else if(is_servant_of_ratvar(M))
M << message
//Function Call action: Calls forth a Ratvarian spear.
/datum/action/innate/function_call
name = "Function Call"
@@ -111,6 +120,23 @@
return 1 //12 or more non-brain servants, 5+ clockwork caches, at least 250 CV, and there are no living, non-servant ais
return 0
/proc/scripture_unlock_alert(list/previous_states) //reports to servants when scripture is locked or unlocked
var/list/states = get_scripture_states()
for(var/i in states)
if(states[i] != previous_states[i])
hierophant_message("<span class='large_brass'><i>Hierophant Network:</i> <b>[i] Scripture has been [states[i] ? "un":""]locked.</b></span>")
/proc/get_scripture_states() //returns the current unlock states of each unlockable scripture tier
. = list("Script" = scripture_unlock_check(SCRIPTURE_SCRIPT), \
"Application" = scripture_unlock_check(SCRIPTURE_APPLICATION), \
"Revenant" = scripture_unlock_check(SCRIPTURE_REVENANT), \
"Judgement" = scripture_unlock_check(SCRIPTURE_JUDGEMENT))
/proc/change_construction_value(amount)
var/list/scripture_states = get_scripture_states()
clockwork_construction_value += amount
scripture_unlock_alert(scripture_states)
/proc/generate_cache_component(specific_component_id) //generates a component in the global component cache, either random based on lowest or a specific component
if(specific_component_id)
clockwork_component_cache[specific_component_id]++
@@ -164,13 +190,20 @@ This cipher is known as "rot13" for "rotate 13 places" and there are many sites
sentence thirteen places ahead changes it right back to plain English.
There are, however, a few parts of the Ratvarian tongue that aren't typical and are implemented for fluff reasons. Some words may have apostrophes, hyphens, and spaces, making the plain
English translation apparent but disjoined (for instance, "Oru`byq zl-cbjre!" translates directly to "Beh'old my-power!") although this can be ignored without impacting overall quality. When
translating from Ratvar's tongue to plain English, simply remove the disjointments and use the finished sentence. This would make "Oru`byq zl-cbjre!" into "Behold my power!" after removing the
English translation apparent but disjoined (for instance, "Orubyq zl-cbjre!" translates directly to "Behold my-power!") although this can be ignored without impacting overall quality. When
translating from Ratvar's tongue to plain English, simply remove the disjointments and use the finished sentence. This would make "Orubyq zl-cbjre!" into "Behold my power!" after removing the
abnormal spacing, hyphens, and grave accents.
List of nuances:
- Any time the word "of" occurs, it is linked to the previous word by a hyphen. If it is the first word, nothing is done. (i.e. "V nz-bs Ratvar." directly translates to "I am-of Ratvar.")
- Any time the word "of" occurs, it is linked to the previous word by a hyphen. (i.e. "V nz-bs Ratvar." directly translates to "I am-of Ratvar.")
- Any time "th", followed by any two letters occurs, you add an apostrophe between those two letters, i.e; "Thi's"
- In the same vein, any time "ti", followed by one letter occurs, you add an apostrophe between "i" and the letter, i.e; "Ti'me"
- Whereever "te" or "et" appear and there is another letter next to the e(i.e; "m"etal, greate"r"), add a hyphen between "e" and the letter, i.e; "M-etal", "Greate-r"
- Where the word "and" appears, it is linked to the previous and following words by hyphens, i.e; "Sword-and-shield"
- Where the word "to" appears, it is linked to the following word by a hyphen, i.e; "to-use"
- Where the word "my" appears, it is linked to the following word by a hyphen, i.e; "my-light"
- Although "Ratvar" translates to "Engine" in English, the word "Ratvar" is used regardless of language as it is a proper noun.
- The same rule applies to Ratvar's four generals: Nezbere (Armorer), Sevtug (Fright), Nzcrentr (Amperage), and Inath-Neq (Vangu-Ard), although these words can be used in proper context if one is
not referring to the four generals and simply using the words themselves.
@@ -168,6 +168,15 @@
/turf/open/floor/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return list("operation_time" = 30, "new_obj_type" = /turf/open/floor/clockwork, "alloy_cost" = REPLICANT_FLOOR, "spawn_dir" = SOUTH)
/turf/open/floor/plating/asteroid/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
/turf/open/floor/plating/ash/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
/turf/open/floor/plating/lava/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return FALSE
/turf/open/floor/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
for(var/obj/O in src)
if(O.density && !O.CanPass(user, src, 5))
+2 -2
View File
@@ -176,7 +176,7 @@
var/datum/action/innate/cultcomm/C = new()
C.Grant(cult_mind.current)
update_cult_icons_added(cult_mind)
cult_mind.current.attack_log += "\[[time_stamp()]\] <span class='danger'>Has been converted to the cult!</span>"
cult_mind.current.attack_log += "\[[time_stamp()]\] <span class='cult'>Has been converted to the cult of Nar'Sie!</span>"
if(jobban_isbanned(cult_mind.current, ROLE_CULTIST))
replace_jobbaned_player(cult_mind.current, ROLE_CULTIST, ROLE_CULTIST)
return 1
@@ -200,7 +200,7 @@
cult_mind.current << "<span class='userdanger'>An unfamiliar white light flashes through your mind, cleansing the taint of the Dark One and all your memories as its servant.</span>"
cult_mind.memory = ""
update_cult_icons_removed(cult_mind)
cult_mind.current.attack_log += "\[[time_stamp()]\] <span class='danger'>Has renounced the cult!</span>"
cult_mind.current.attack_log += "\[[time_stamp()]\] <span class='cult'>Has renounced the cult of Nar'Sie!</span>"
if(show_message)
for(var/mob/M in viewers(cult_mind.current))
M << "<span class='big'>[cult_mind.current] looks like they just reverted to their old faith!</span>"
@@ -93,23 +93,6 @@
world << "<B>The AI cleansed the station of life with the doomsday device!</B>"
ticker.force_ending = 1
/datum/AI_Module/large/fireproof_core
module_name = "Core Upgrade"
mod_pick_name = "coreup"
description = "An upgrade to improve core resistance, making it immune to fire and heat. This effect is permanent."
cost = 50
one_time = 1
power_type = /mob/living/silicon/ai/proc/fireproof_core
/mob/living/silicon/ai/proc/fireproof_core()
set category = "Malfunction"
set name = "Fireproof Core"
for(var/mob/living/silicon/ai/ai in player_list)
ai.fire_res_on_core = 1
src.verbs -= /mob/living/silicon/ai/proc/fireproof_core
src << "<span class='notice'>Core fireproofed.</span>"
/datum/AI_Module/large/upgrade_turrets
module_name = "AI Turret Upgrade"
mod_pick_name = "turret"
@@ -250,8 +250,8 @@
PoolOrNew(/obj/effect/overlay/temp/revenant, T)
if(!istype(T, /turf/open/floor/plating) && !istype(T, /turf/open/floor/engine/cult) && istype(T, /turf/open/floor) && prob(15))
var/turf/open/floor/floor = T
if(floor.intact)
floor.builtin_tile.loc = floor
if(floor.intact && floor.floor_tile)
PoolOrNew(floor.floor_tile, floor)
floor.broken = 0
floor.burnt = 0
floor.make_plating(1)
+2 -1
View File
@@ -358,7 +358,8 @@
else if(!helmet && !mask && !suit && !storage && !occupant)
return
else
occupant << "<span class='userdanger'>[src]'s confines grow warm, then hot, then scorching. You're being burned [!occupant.stat ? "alive" : "away"]!</span>"
if(occupant)
occupant << "<span class='userdanger'>[src]'s confines grow warm, then hot, then scorching. You're being burned [!occupant.stat ? "alive" : "away"]!</span>"
cook()
. = TRUE
if("dispense")
+3 -1
View File
@@ -305,7 +305,9 @@
if(canister.charges[STANDARD_CHARGE] == 0)
user << "<span class='notice'>This [canister.name] is empty!</span>"
else
var/transfered = refill_inventory(canister,product_records,user)
var/transfered = refill_inventory(canister,product_records,STANDARD_CHARGE)
transfered += refill_inventory(canister,coin_records,COIN_CHARGE)
transfered += refill_inventory(canister,hidden_records,CONTRABAND_CHARGE)
if(transfered)
user << "<span class='notice'>You loaded [transfered] items in \the [name].</span>"
else
+16 -3
View File
@@ -567,11 +567,24 @@ obj/item/proc/item_action_slot_check(slot, mob/user)
else
. = pick('sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg')
/obj/item/proc/open_flame()
/obj/item/proc/open_flame(flame_heat=700)
var/turf/location = loc
if(ismob(location))
var/mob/M = location
if(M.l_hand == src || M.r_hand == src)
var/success = FALSE
if(src == M.get_item_by_slot(slot_l_hand))
success = TRUE
else if(src == M.get_item_by_slot(slot_r_hand))
success = TRUE
else if(src == M.get_item_by_slot(slot_wear_mask))
success = TRUE
if(success)
location = get_turf(M)
if(isturf(location))
location.hotspot_expose(700, 5)
location.hotspot_expose(flame_heat, 5)
/obj/item/proc/ignition_effect(atom/A, mob/user)
if(is_hot())
. = "<span class='notice'>[user] lights [A] with [src].</span>"
else
. = ""
+4 -23
View File
@@ -31,39 +31,20 @@
/obj/item/candle/attackby(obj/item/weapon/W, mob/user, params)
..()
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.isOn()) //Badasses dont get blinded by lighting their candle with a welding tool
light("<span class='danger'>[user] casually lights the [name] with [W], what a badass.</span>")
else if(istype(W, /obj/item/weapon/lighter))
var/obj/item/weapon/lighter/L = W
if(L.lit)
light()
else if(istype(W, /obj/item/weapon/match))
var/obj/item/weapon/match/M = W
if(M.lit)
light()
else if(istype(W, /obj/item/candle))
var/obj/item/candle/C = W
if(C.lit)
light()
else if(istype(W, /obj/item/clothing/mask/cigarette))
var/obj/item/clothing/mask/cigarette/M = W
if(M.lit)
light()
var/msg = W.ignition_effect(src, user)
if(msg)
light(msg)
/obj/item/candle/fire_act()
if(!src.lit)
light() //honk
return
/obj/item/candle/proc/light(show_message)
if(!src.lit)
src.lit = TRUE
//src.damtype = "fire"
if(show_message)
usr.visible_message(
"<span class='danger'>[usr] lights the [name].</span>")
usr.visible_message(show_message)
SetLuminosity(CANDLE_LUMINOSITY)
START_PROCESSING(SSobj, src)
update_icon()
@@ -5,6 +5,7 @@
icon = 'icons/obj/cardboard_cutout.dmi'
icon_state = "cutout_basic"
w_class = 4
burn_state = FLAMMABLE
var/list/possible_appearances = list("Assistant", "Clown", "Mime", "Traitor", "Nuke Op", "Cultist", "Clockwork Cultist", "Revolutionary", "Wizard", "Shadowling", "Xenomorph", "Swarmer", \
"Ash Walker", "Deathsquad Officer", "Ian") //Possible restyles for the cutout; add an entry in change_appearance() if you add to here
var/pushed_over = FALSE //If the cutout is pushed over and has to be righted
@@ -199,9 +199,7 @@ obj/item/device/flashlight/lamp/bananalamp
..()
/obj/item/device/flashlight/flare/process()
var/turf/pos = get_turf(src)
if(pos)
pos.hotspot_expose(produce_heat, 5)
open_flame(heat)
fuel = max(fuel - 1, 0)
if(!fuel || !on)
turn_off()
@@ -209,6 +207,13 @@ obj/item/device/flashlight/lamp/bananalamp
icon_state = "[initial(icon_state)]-empty"
STOP_PROCESSING(SSobj, src)
/obj/item/device/flashlight/flare/ignition_effect(atom/A, mob/user)
if(fuel && on)
. = "<span class='notice'>[user] lights [A] with [src] like a real \
badass.</span>"
else
. = ""
/obj/item/device/flashlight/flare/proc/turn_off()
on = 0
force = initial(src.force)
@@ -29,7 +29,7 @@
var/obj/item/stack/sheet/metal/M = O
if (M.use(1))
use(1)
var/obj/item/stack/tile/light/L = new (user.loc)
var/obj/item/L = PoolOrNew(/obj/item/stack/tile/light, user.loc)
user << "<span class='notice'>You make a light tile.</span>"
L.add_fingerprint(user)
else
@@ -129,6 +129,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \
new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\
new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\
new/datum/stack_recipe("ore box", /obj/structure/ore_box, 4, time = 50, one_per_turf = 1, on_floor = 1),\
new/datum/stack_recipe("baseball bat", /obj/item/weapon/melee/baseball_bat, 5, time = 15),\
)
/obj/item/stack/sheet/mineral/wood
@@ -18,6 +18,10 @@
pixel_x = rand(-3, 3)
pixel_y = rand(-3, 3) //randomize a little
/obj/item/stack/tile/Destroy()
..()
return QDEL_HINT_PUTINPOOL
/obj/item/stack/tile/attackby(obj/item/W, mob/user, params)
if (istype(W, /obj/item/weapon/weldingtool))
@@ -276,3 +276,17 @@ update_label("John Doe", "Clowny")
/obj/item/weapon/card/id/mining
name = "mining ID"
access = list(access_mining, access_mining_station, access_mineral_storeroom)
/obj/item/weapon/card/id/away
name = "a perfectly generic identification card"
desc = "A perfectly generic identification card. Looks like it could use some flavor."
access = list(access_away_general)
/obj/item/weapon/card/id/away/hotel
name = "Staff ID"
desc = "A staff ID used to access the hotel's doors."
access = list(access_away_general, access_away_maint)
/obj/item/weapon/card/id/away/hotel/securty
name = "Officer ID"
access = list(access_away_general, access_away_maint, access_away_sec)
@@ -20,28 +20,26 @@ CIGARETTE PACKETS ARE IN FANCY.DM
desc = "A simple match stick, used for lighting fine smokables."
icon = 'icons/obj/cigarettes.dmi'
icon_state = "match_unlit"
var/lit = 0
var/lit = FALSE
var/burnt = FALSE
var/smoketime = 5
w_class = 1
origin_tech = "materials=1"
heat = 1000
/obj/item/weapon/match/process()
var/turf/location = get_turf(src)
smoketime--
if(smoketime < 1)
matchburnout()
return
if(location)
location.hotspot_expose(700, 5)
return
else
open_flame(heat)
/obj/item/weapon/match/fire_act()
matchignite()
/obj/item/weapon/match/proc/matchignite()
if(lit == 0)
lit = 1
if(!lit && !burnt)
lit = TRUE
icon_state = "match_lit"
damtype = "fire"
force = 3
@@ -52,31 +50,31 @@ CIGARETTE PACKETS ARE IN FANCY.DM
attack_verb = list("burnt","singed")
START_PROCESSING(SSobj, src)
update_icon()
return
/obj/item/weapon/match/proc/matchburnout()
if(lit == 1)
lit = -1
if(lit)
lit = FALSE
burnt = TRUE
damtype = "brute"
force = initial(force)
icon_state = "match_burnt"
item_state = "cigoff"
name = "burnt match"
desc = "A match. This one has seen better days."
attack_verb = null
attack_verb = list("flicked")
STOP_PROCESSING(SSobj, src)
/obj/item/weapon/match/dropped(mob/user)
matchburnout()
return ..()
. = ..()
/obj/item/weapon/match/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!isliving(M))
return
if(M.IgniteMob())
if(lit && M.IgniteMob())
message_admins("[key_name_admin(user)] set [key_name_admin(M)] on fire")
log_game("[key_name(user)] set [key_name(M)] on fire")
var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M,user)
var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M)
if(lit && cig && user.a_intent == "help")
if(cig.lit)
user << "<span class='notice'>The [cig.name] is already lit.</span>"
@@ -87,12 +85,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else
..()
/obj/item/proc/help_light_cig(mob/living/carbon/M, mob/living/carbon/user)
if(!iscarbon(M))
return
if(istype(M.wear_mask, /obj/item/clothing/mask/cigarette))
var/obj/item/clothing/mask/cigarette/cig = M.wear_mask
return cig
/obj/item/proc/help_light_cig(mob/living/M)
var/mask_item = M.get_item_by_slot(slot_wear_mask)
if(istype(mask_item, /obj/item/clothing/mask/cigarette))
return mask_item
/obj/item/weapon/match/is_hot()
return lit * heat
@@ -123,7 +119,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/cigarette/New()
..()
create_reagents(chem_volume) // making the cigarette a chemical holder with a maximum volume of 15
create_reagents(chem_volume)
reagents.set_reacting(FALSE) // so it doesn't react until you light it
reagents.add_reagent("nicotine", 15)
@@ -134,8 +130,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
. = ..()
/obj/item/clothing/mask/cigarette/attackby(obj/item/weapon/W, mob/user, params)
if(!lit && smoketime > 0 && W.is_hot())
var/lighting_text = is_lighter(W,user)
if(!lit && smoketime > 0)
var/lighting_text = W.ignition_effect(src, user)
if(lighting_text)
light(lighting_text)
else
@@ -154,29 +150,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else
user << "<span class='notice'>[src] is full.</span>"
/obj/item/clothing/mask/cigarette/proc/is_lighter(obj/item/O, mob/user)
var/lighting_text = null
if(istype(O, /obj/item/weapon/weldingtool))
lighting_text = "<span class='notice'>[user] casually lights the [name] with [O], what a badass.</span>"
else if(istype(O, /obj/item/weapon/lighter/greyscale)) // we have to check for this first -- zippo lighters are default
lighting_text = "<span class='notice'>After some fiddling, [user] manages to light their [name] with [O].</span>"
else if(istype(O, /obj/item/weapon/lighter))
lighting_text = "<span class='rose'>With a single flick of their wrist, [user] smoothly lights their [name] with [O]. Damn they're cool.</span>"
else if(istype(O, /obj/item/weapon/melee/energy))
var/in_mouth = ""
if(iscarbon(user))
var/mob/living/carbon/C = user
if(C.wear_mask == src)
in_mouth = ", barely missing their nose"
lighting_text = "<span class='warning'>[user] swings their \
[O][in_mouth]. They light their [name] in the process.</span>"
else if(istype(O, /obj/item/device/assembly/igniter))
lighting_text = "<span class='notice'>[user] fiddles with [O], and manages to light their [name].</span>"
else if(istype(O, /obj/item/device/flashlight/flare))
lighting_text = "<span class='notice'>[user] lights their [name] with [O] like a real badass.</span>"
else if(O.is_hot())
lighting_text = "<span class='notice'>[user] lights their [name] with [O].</span>"
return lighting_text
/obj/item/clothing/mask/cigarette/proc/light(flavor_text = null)
if(lit)
@@ -255,17 +228,17 @@ CIGARETTE PACKETS ARE IN FANCY.DM
handle_reagents()
/obj/item/clothing/mask/cigarette/attack_self(mob/user)
if(lit == 1)
if(lit)
user.visible_message("<span class='notice'>[user] calmly drops and treads on \the [src], putting it out instantly.</span>")
new type_butt(user.loc)
new /obj/effect/decal/cleanable/ash(user.loc)
qdel(src)
return ..()
. = ..()
/obj/item/clothing/mask/cigarette/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!istype(M))
return ..()
var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M,user)
var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M)
if(lit && cig && user.a_intent == "help")
if(cig.lit)
user << "<span class='notice'>The [cig.name] is already lit.</span>"
@@ -303,7 +276,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
..()
reagents.add_reagent("mushroomhallucinogen", 50)
light()
//for(var/mob/M in player_list) M << 'sound/misc/Smoke_Weed_Everyday.ogg'
/obj/item/weapon/cigbutt/roach
@@ -407,7 +379,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
open_flame()
if(reagents && reagents.total_volume) // check if it has any reagents at all
handle_reagents()
return
/obj/item/clothing/mask/cigarette/pipe/attackby(obj/item/O, mob/user, params)
@@ -427,7 +398,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else
user << "<span class='warning'>It is already packed!</span>"
else
var/lighting_text = is_lighter(O,user)
var/lighting_text = O.ignition_effect(src,user)
if(lighting_text)
if(smoketime > 0)
light(lighting_text)
@@ -489,6 +460,14 @@ CIGARETTE PACKETS ARE IN FANCY.DM
I.color = color2hex(randomColor(1))
add_overlay(I)
/obj/item/weapon/lighter/greyscale/ignition_effect(atom/A, mob/user)
. = "<span class='notice'>After some fiddling, [user] manages to \
light [A] with [src].</span>"
/obj/item/weapon/lighter/ignition_effect(atom/A, mob/user)
. = "<span class='rose'>With a single flick of their wrist, [user] \
smoothly lights [A] with [src]. Damn they're cool.</span>"
/obj/item/weapon/lighter/update_icon()
icon_state = lit ? "[icon_state]_on" : "[initial(icon_state)]"
@@ -526,14 +505,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM
user.AddLuminosity(-1)
STOP_PROCESSING(SSobj, src)
else
return ..()
return
. = ..()
/obj/item/weapon/lighter/attack(mob/living/carbon/M, mob/living/carbon/user)
if(lit && M.IgniteMob())
message_admins("[key_name_admin(user)] set [key_name_admin(M)] on fire")
log_game("[key_name(user)] set [key_name(M)] on fire")
var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M,user)
var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M)
if(lit && cig && user.a_intent == "help")
if(cig.lit)
user << "<span class='notice'>The [cig.name] is already lit.</span>"
@@ -548,18 +526,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM
..()
/obj/item/weapon/lighter/process()
var/turf/location = get_turf(src)
if(location)
location.hotspot_expose(700, 5)
return
open_flame()
/obj/item/weapon/lighter/pickup(mob/user)
..()
if(lit)
SetLuminosity(0)
user.AddLuminosity(1)
return
/obj/item/weapon/lighter/dropped(mob/user)
..()
@@ -567,7 +540,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(user)
user.AddLuminosity(-1)
SetLuminosity(1)
return
/obj/item/weapon/lighter/is_hot()
return lit * heat
@@ -177,4 +177,3 @@
theturf.MakeSlippery(min_wet_time = 10, wet_time_to_add = 5)
user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "<span class='info'>You quietly empty out \the [src] using its release valve.</span>")
return
@@ -265,15 +265,13 @@
/obj/item/weapon/nullrod/fedora
name = "atheist's fedora"
desc = "The brim of the hat is as sharp as your wit. Throwing it at someone would hurt almost as much as disproving the existence of God."
desc = "The brim of the hat is as sharp as your wit. The edge would hurt almost as much as disproving the existence of God."
icon_state = "fedora"
item_state = "fedora"
slot_flags = SLOT_HEAD
icon = 'icons/obj/clothing/hats.dmi'
force = 0
throw_speed = 4
throw_range = 7
throwforce = 20
sharpness = IS_SHARP
attack_verb = list("enlightened", "redpilled")
/obj/item/weapon/nullrod/armblade
name = "dark blessing"
@@ -63,6 +63,16 @@
if(item_color == null)
item_color = pick("red", "blue", "green", "purple")
/obj/item/weapon/melee/energy/sword/Destroy()
STOP_PROCESSING(SSobj, src)
. = ..()
/obj/item/weapon/melee/energy/sword/process()
if(active)
open_flame()
else
STOP_PROCESSING(SSobj, src)
/obj/item/weapon/melee/energy/sword/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
if(active)
return ..()
@@ -87,6 +97,7 @@
w_class = w_class_on
playsound(user, 'sound/weapons/saberon.ogg', 35, 1) //changed it from 50% volume to 35% because deafness
user << "<span class='notice'>[src] is now active.</span>"
START_PROCESSING(SSobj, src)
else
force = initial(force)
throwforce = initial(throwforce)
@@ -98,11 +109,26 @@
w_class = initial(w_class)
playsound(user, 'sound/weapons/saberoff.ogg', 35, 1) //changed it from 50% volume to 35% because deafness
user << "<span class='notice'>[src] can now be concealed.</span>"
STOP_PROCESSING(SSobj, src)
add_fingerprint(user)
/obj/item/weapon/melee/energy/is_hot()
return active * heat
/obj/item/weapon/melee/energy/ignition_effect(atom/A, mob/user)
if(!active)
return ""
var/in_mouth = ""
if(iscarbon(user))
var/mob/living/carbon/C = user
if(C.wear_mask == src)
in_mouth = ", barely missing their nose"
. = "<span class='warning'>[user] swings their \
[src][in_mouth]. They light [A] in the process.</span>"
playsound(loc, hitsound, get_clamped_volume(), 1, -1)
add_fingerprint(user)
/obj/item/weapon/melee/energy/sword/cyborg
var/hitcost = 50
@@ -285,7 +285,7 @@
/obj/item/weapon/storage/backpack/satchel_flat/New()
..()
new /obj/item/stack/tile/plasteel(src)
PoolOrNew(/obj/item/stack/tile/plasteel, src)
new /obj/item/weapon/crowbar(src)
/obj/item/weapon/storage/backpack/dufflebag
@@ -60,7 +60,7 @@
qdel(air_contents)
STOP_PROCESSING(SSobj, src)
return ..()
. = ..()
/obj/item/weapon/tank/examine(mob/user)
var/obj/icon = src
@@ -127,7 +127,7 @@
else if(istype(W, /obj/item/device/assembly_holder))
bomb_assemble(W,user)
else
return ..()
. = ..()
/obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
datum/tgui/master_ui = null, datum/ui_state/state = hands_state)
+9 -3
View File
@@ -342,11 +342,11 @@
check_fuel()
if(M)
M.flash_eyes(light_intensity)
return 1
return TRUE
else
if(M)
M << "<span class='warning'>You need more welding fuel to complete this task!</span>"
return 0
return FALSE
//Returns whether or not the welding tool is currently on.
@@ -424,7 +424,13 @@
user.put_in_hands(F)
else
user << "<span class='warning'>You need one rod to start building a flamethrower!</span>"
return
/obj/item/weapon/weldingtool/ignition_effect(atom/A, mob/user)
if(welding && remove_fuel(1, user))
. = "<span class='notice'>[user] casually lights [A] with [src], \
what a badass.</span>"
else
. = ""
/obj/item/weapon/weldingtool/largetank
name = "industrial welding tool"
+37 -7
View File
@@ -211,15 +211,19 @@
var/hacked = 0
/obj/item/weapon/twohanded/dualsaber/New()
..()
item_color = pick("red", "blue", "green", "purple")
/obj/item/weapon/twohanded/dualsaber/Destroy()
STOP_PROCESSING(SSobj, src)
. = ..()
/obj/item/weapon/twohanded/dualsaber/update_icon()
if(wielded)
icon_state = "dualsaber[item_color][wielded]"
else
icon_state = "dualsaber0"
clean_blood()//blood overlays get weird otherwise, because the sprite changes.
return
/obj/item/weapon/twohanded/dualsaber/attack(mob/target, mob/living/carbon/human/user)
if(user.has_dna())
@@ -232,12 +236,14 @@
impale(user)
return
if((wielded) && prob(50))
spawn(0)
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2))
user.setDir(i)
if(i == 8)
user.emote("flip")
sleep(1)
addtimer(src, "jedi_spin", 0, TRUE, user)
/obj/item/weapon/twohanded/dualsaber/proc/jedi_spin(mob/living/user)
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2))
user.setDir(i)
if(i == 8)
user.emote("flip")
sleep(1)
/obj/item/weapon/twohanded/dualsaber/proc/impale(mob/living/user)
user << "<span class='warning'>You twirl around a bit before losing your balance and impaling yourself on \the [src].</span>"
@@ -265,17 +271,41 @@
w_class = w_class_on
..()
hitsound = 'sound/weapons/blade1.ogg'
START_PROCESSING(SSobj, src)
/obj/item/weapon/twohanded/dualsaber/unwield() //Specific unwield () to switch hitsounds.
sharpness = initial(sharpness)
w_class = initial(w_class)
..()
hitsound = "swing_hit"
STOP_PROCESSING(SSobj, src)
/obj/item/weapon/twohanded/dualsaber/process()
if(wielded)
open_flame()
else
STOP_PROCESSING(SSobj, src)
/obj/item/weapon/twohanded/dualsaber/IsReflect()
if(wielded)
return 1
/obj/item/weapon/twohanded/dualsaber/ignition_effect(atom/A, mob/user)
// same as /obj/item/weapon/melee/energy, mostly
if(!wielded)
return ""
var/in_mouth = ""
if(iscarbon(user))
var/mob/living/carbon/C = user
if(C.wear_mask == src)
in_mouth = ", barely missing their nose"
. = "<span class='warning'>[user] swings their \
[src][in_mouth]. They light [A] in the process.</span>"
playsound(loc, hitsound, get_clamped_volume(), 1, -1)
add_fingerprint(user)
// Light your candles while spinning around the room
addtimer(src, "jedi_spin", 0, TRUE, user)
/obj/item/weapon/twohanded/dualsaber/green/New()
item_color = "green"
@@ -25,7 +25,7 @@
/obj/item/weapon/vending_refill/examine(mob/user)
..()
if(charges[1] > 0)
user << "It can restock [charges[1]] item(s)."
user << "It can restock [charges[1]+charges[2]+charges[3]] item(s)."
else
user << "It's empty!"
@@ -298,3 +298,19 @@
/obj/item/weapon/melee/skateboard/attack_self(mob/user)
new /obj/vehicle/scooter/skateboard(get_turf(user))
qdel(src)
/obj/item/weapon/melee/baseball_bat
name = "baseball bat"
desc = "There ain't a skull in the league that can withstand a swatter."
icon = 'icons/obj/items.dmi'
icon_state = "baseball_bat"
item_state = "baseball_bat"
force = 10
throwforce = 12
attack_verb = list("beat", "smacked")
w_class = 5
/obj/item/weapon/melee/baseball_bat/attack(mob/living/target, mob/living/user)
. = ..()
var/atom/throw_target = get_edge_target_turf(target, user.dir)
target.throw_at(throw_target, rand(1,2), 7, user)
-2
View File
@@ -219,5 +219,3 @@
/obj/proc/CanAStarPass()
. = !density
@@ -335,7 +335,7 @@
if(!usr.canmove || usr.stat || usr.restrained())
return
if(iscarbon(usr) || issilicon(usr))
if(iscarbon(usr) || issilicon(usr) || isdrone(usr))
attack_hand(usr)
else
usr << "<span class='warning'>This mob type can't use this verb.</span>"
@@ -41,11 +41,20 @@
return
..()
/obj/structure/closet/crate/open(mob/living/user)
. = ..()
if(. && manifest)
user << "<span class='notice'>The manifest is torn off [src].</span>"
playsound(src, 'sound/items/poster_ripped.ogg', 75, 1)
manifest.forceMove(get_turf(src))
manifest = null
update_icon()
/obj/structure/closet/crate/proc/tear_manifest(mob/user)
user << "<span class='notice'>You tear the manifest off of the crate.</span>"
user << "<span class='notice'>You tear the manifest off of [src].</span>"
playsound(src, 'sound/items/poster_ripped.ogg', 75, 1)
manifest.loc = loc
manifest.forceMove(loc)
if(ishuman(user))
user.put_in_hands(manifest)
manifest = null
+153
View File
@@ -0,0 +1,153 @@
#define LOG_BURN_TIMER 150
#define PAPER_BURN_TIMER 5
#define MAXIMUM_BURN_TIMER 3000
/obj/structure/fireplace
name = "fireplace"
desc = "A large stone brick fireplace."
icon = 'icons/obj/fireplace.dmi'
icon_state = "fireplace"
density = FALSE
anchored = TRUE
pixel_x = -16
burn_state = FIRE_PROOF
var/lit = FALSE
var/fuel_added = 0
var/flame_expiry_timer
/obj/structure/fireplace/New()
..()
START_PROCESSING(SSobj, src)
/obj/structure/fireplace/Destroy()
STOP_PROCESSING(SSobj, src)
. = ..()
/obj/structure/fireplace/proc/try_light(obj/item/O, mob/user)
if(lit)
user << "<span class='warning'>It's already lit!</span>"
return FALSE
if(!fuel_added)
user << "<span class='warning'>[src] needs some fuel to burn!</span>"
return FALSE
var/msg = O.ignition_effect(src, user)
if(msg)
visible_message(msg)
ignite()
return TRUE
/obj/structure/fireplace/attackby(obj/item/T, mob/user)
if(istype(T,/obj/item/stack/sheet/mineral/wood))
var/obj/item/stack/sheet/mineral/wood/wood = T
var/space_remaining = MAXIMUM_BURN_TIMER - burn_time_remaining()
var/space_for_logs = round(space_remaining / LOG_BURN_TIMER)
if(space_for_logs < 1)
user << "<span class='warning'>You can't fit any more of [T] in \
[src]!</span>"
return
var/logs_used = min(space_for_logs, wood.amount)
wood.use(logs_used)
adjust_fuel_timer(LOG_BURN_TIMER * logs_used)
user.visible_message("<span class='notice'>[user] tosses some \
wood into [src].</span>", "<span class='notice'>You add \
some fuel to [src].</span>")
else if(istype(T, /obj/item/weapon/paper_bin))
var/obj/item/weapon/paper_bin/paper_bin = T
user.visible_message("<span class='notice'>[user] throws [T] into \
[src].</span>", "<span class='notice'>You add [T] to [src].\
</span>")
adjust_fuel_timer(PAPER_BURN_TIMER * paper_bin.amount)
qdel(paper_bin)
else if(istype(T, /obj/item/weapon/paper))
user.visible_message("<span class='notice'>[user] throws [T] into \
[src].</span>", "<span class='notice'>You throw [T] into [src].\
</span>")
adjust_fuel_timer(PAPER_BURN_TIMER)
qdel(T)
else if(try_light(T,user))
return
else
. = ..()
/obj/structure/fireplace/update_icon()
cut_overlays()
if(lit)
switch(burn_time_remaining())
if(0 to 500)
add_overlay("fireplace_fire0")
if(500 to 1000)
add_overlay("fireplace_fire1")
if(1000 to 1500)
add_overlay("fireplace_fire2")
if(1500 to 2000)
add_overlay("fireplace_fire3")
if(2000 to MAXIMUM_BURN_TIMER)
add_overlay("fireplace_fire4")
add_overlay("fireplace_glow")
/obj/structure/fireplace/proc/adjust_light()
if(!lit)
SetLuminosity(0)
return
switch(burn_time_remaining())
if(0 to 500)
SetLuminosity(1)
if(500 to 1000)
SetLuminosity(2)
if(1000 to 1500)
SetLuminosity(3)
if(1500 to 2000)
SetLuminosity(4)
if(2000 to MAXIMUM_BURN_TIMER)
SetLuminosity(6)
/obj/structure/fireplace/process()
if(!lit)
return
if(world.time > flame_expiry_timer)
put_out()
return
playsound(src, 'sound/effects/comfyfire.ogg',50,0, 0, 1)
var/turf/T = get_turf(src)
T.hotspot_expose(700, 5)
update_icon()
adjust_light()
/obj/structure/fireplace/extinguish()
if(lit)
var/fuel = burn_time_remaining()
flame_expiry_timer = 0
put_out()
adjust_fuel_timer(fuel)
. = ..()
/obj/structure/fireplace/proc/adjust_fuel_timer(amount)
if(lit)
flame_expiry_timer += amount
if(burn_time_remaining() < MAXIMUM_BURN_TIMER)
flame_expiry_timer = world.time + MAXIMUM_BURN_TIMER
else
fuel_added = Clamp(fuel_added + amount, 0, MAXIMUM_BURN_TIMER)
/obj/structure/fireplace/proc/burn_time_remaining()
if(lit)
return max(0, flame_expiry_timer - world.time)
else
return max(0, fuel_added)
/obj/structure/fireplace/proc/ignite()
lit = TRUE
desc = "A large stone brick fireplace, warm and cozy."
flame_expiry_timer = world.time + fuel_added
fuel_added = 0
update_icon()
adjust_light()
/obj/structure/fireplace/proc/put_out()
lit = FALSE
update_icon()
adjust_light()
desc = initial(desc)
+13 -2
View File
@@ -40,7 +40,7 @@
/obj/structure/fluff/empty_sleeper/nanotrasen
name = "broken hypersleep chamber"
desc = "A NanoTrasen hypersleep chamber - this one appears broken. \
desc = "A Nanotrasen hypersleep chamber - this one appears broken. \
There are exposed bolts for easy disassembly using a wrench."
icon_state = "sleeper-o"
@@ -55,6 +55,17 @@
/obj/structure/fluff/broken_flooring
name = "broken tiling"
desc = "A segment of broken flooring"
desc = "A segment of broken flooring."
icon = 'icons/obj/brokentiling.dmi'
icon_state = "corner"
/obj/structure/fluff/drake_statue //Ash drake status spawn on either side of the necropolis gate in lavaland.
name = "drake statue"
desc = "A towering basalt sculpture of a proud and regal drake. Its eyes are six glowing gemstones."
icon = 'icons/effects/64x64.dmi'
icon_state = "drake_statue"
density = TRUE
/obj/structure/fluff/drake_statue/falling //A variety of statue in disrepair; parts are broken off and a gemstone is missing
desc = "A towering basalt sculpture of a drake. Cracks run down its surface and parts of it have fallen off."
icon_state = "drake_statue_falling"
+11
View File
@@ -40,14 +40,22 @@ var/global/list/GlobalPool = list()
if(!get_type)
return
if(SSpool)
INCREMENT_TALLY(SSpool.stats_pooled_or_newed, get_type)
. = GetFromPool(get_type,second_arg)
if(!.)
if(SSpool)
INCREMENT_TALLY(SSpool.stats_created_new, get_type)
if(ispath(get_type))
if(islist(second_arg))
. = new get_type (arglist(second_arg))
else
. = new get_type (second_arg)
else
if(SSpool)
INCREMENT_TALLY(SSpool.stats_reused, get_type)
/proc/GetFromPool(get_type,second_arg)
@@ -88,6 +96,9 @@ var/global/list/GlobalPool = list()
if(diver in GlobalPool[diver.type])
return
if(SSpool)
INCREMENT_TALLY(SSpool.stats_placed_in_pool, diver.type)
if(!GlobalPool[diver.type])
GlobalPool[diver.type] = list()
+10 -20
View File
@@ -19,7 +19,6 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
//NOTE: Floor code has been refactored, many procs were removed and refactored
//- you should use istype() if you want to find out whether a floor has a certain type
//- floor_tile is now a path, and not a tile obj
//- builtin_tile should be dropped if needed for performance reasons (eg singularity_act())
name = "floor"
icon = 'icons/turf/floors.dmi'
@@ -31,7 +30,6 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
var/broken = 0
var/burnt = 0
var/floor_tile = null //tile that this floor drops
var/obj/item/stack/tile/builtin_tile = null //needed for performance reasons when the singularity rips off floor tiles
var/list/broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
var/list/burnt_states = list()
@@ -41,14 +39,6 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
icon_regular_floor = "floor"
else
icon_regular_floor = icon_state
if(floor_tile)
builtin_tile = new floor_tile
/turf/open/floor/Destroy()
if(builtin_tile)
qdel(builtin_tile)
builtin_tile = null
return ..()
/turf/open/floor/ex_act(severity, target)
var/shielded = is_shielded()
@@ -58,8 +48,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
if(target == src)
src.ChangeTurf(src.baseturf)
if(target != null)
ex_act(3)
return
severity = 3
switch(severity)
if(1)
@@ -151,7 +140,8 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
user << "<span class='danger'>You forcefully pry off the planks, destroying them in the process.</span>"
else
user << "<span class='danger'>You remove the floor tile.</span>"
builtin_tile.loc = src
if(floor_tile)
PoolOrNew(floor_tile, src)
make_plating()
playsound(src, 'sound/items/Crowbar.ogg', 80, 1)
return 1
@@ -160,18 +150,18 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
/turf/open/floor/singularity_pull(S, current_size)
if(current_size == STAGE_THREE)
if(prob(30))
if(builtin_tile)
builtin_tile.loc = src
if(floor_tile)
PoolOrNew(floor_tile, src)
make_plating()
else if(current_size == STAGE_FOUR)
if(prob(50))
if(builtin_tile)
builtin_tile.loc = src
if(floor_tile)
PoolOrNew(floor_tile, src)
make_plating()
else if(current_size >= STAGE_FIVE)
if(builtin_tile)
if(floor_tile)
if(prob(70))
builtin_tile.loc = src
PoolOrNew(floor_tile, src)
make_plating()
else if(prob(50))
ReplaceWithLattice()
@@ -186,4 +176,4 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
/turf/open/floor/initialize()
..()
MakeDirty()
MakeDirty()
@@ -12,10 +12,6 @@
/turf/open/floor/light/New()
..()
spawn(5) //needed because when placing a light floor tile it will take a short while before setting state
if(istype(builtin_tile, /obj/item/stack/tile/light))
var/obj/item/stack/tile/light/L = builtin_tile
L.state = state
update_icon()
/turf/open/floor/light/update_icon()
+10 -2
View File
@@ -123,11 +123,17 @@
..()
PoolOrNew(/obj/effect/overlay/temp/ratvar/floor, src)
PoolOrNew(/obj/effect/overlay/temp/ratvar/beam, src)
clockwork_construction_value++
change_construction_value(1)
/turf/open/floor/clockwork/Destroy()
STOP_PROCESSING(SSobj, src)
clockwork_construction_value--
change_construction_value(-1)
return ..()
/turf/open/floor/clockwork/ChangeTurf(path, defer_change = FALSE)
if(path != type)
STOP_PROCESSING(SSobj, src)
change_construction_value(-1)
return ..()
/turf/open/floor/clockwork/Entered(atom/movable/AM)
@@ -160,9 +166,11 @@
/turf/open/floor/clockwork/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/weapon/crowbar))
user.visible_message("<span class='notice'>[user] begins slowly prying up [src]...</span>", "<span class='notice'>You begin painstakingly prying up [src]...</span>")
playsound(src, 'sound/items/Crowbar.ogg', 20, 1)
if(!do_after(user, 70 / I.toolspeed, target = src))
return 0
user.visible_message("<span class='notice'>[user] pries up [src]!</span>", "<span class='notice'>You pry up [src], destroying it!</span>")
playsound(src, 'sound/items/Crowbar.ogg', 80, 1)
make_plating()
return 1
return ..()
+2 -2
View File
@@ -168,9 +168,9 @@
/turf/open/floor/engine/singularity_pull(S, current_size)
if(current_size >= STAGE_FIVE)
if(builtin_tile)
if(floor_tile)
if(prob(30))
builtin_tile.loc = src
PoolOrNew(floor_tile, src)
make_plating()
else if(prob(30))
ReplaceWithLattice()
@@ -183,6 +183,7 @@
icon_state = "abductor"
walltype = "abductor"
mineral = "abductor"
smooth = SMOOTH_TRUE|SMOOTH_DIAGONAL
sheet_type = /obj/item/stack/sheet/mineral/abductor
slicing_duration = 200 //alien wall takes twice as much time to slice
explosion_block = 3
+10 -4
View File
@@ -53,17 +53,23 @@
..()
PoolOrNew(/obj/effect/overlay/temp/ratvar/wall, src)
PoolOrNew(/obj/effect/overlay/temp/ratvar/beam, src)
clockwork_construction_value += 5
change_construction_value(5)
/turf/closed/wall/clockwork/Destroy()
clockwork_construction_value -= 5
..()
change_construction_value(-5)
return ..()
/turf/closed/wall/clockwork/ChangeTurf(path, defer_change = FALSE)
if(path != type)
change_construction_value(-5)
return ..()
/turf/closed/wall/clockwork/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = I
if(!WT.isOn())
if(!WT.remove_fuel(0,user))
return 0
playsound(src, 'sound/items/Welder.ogg', 100, 1)
user.visible_message("<span class='notice'>[user] begins slowly breaking down [src]...</span>", "<span class='notice'>You begin painstakingly destroying [src]...</span>")
if(!do_after(user, 120 / WT.toolspeed, target = src))
return 0
+17 -10
View File
@@ -34,7 +34,7 @@
return
/client/proc/create_poll_function()
var/polltype = input("Choose poll type.","Poll Type") in list("Single Option","Text Reply","Rating","Multiple Choice")
var/polltype = input("Choose poll type.","Poll Type") in list("Single Option","Text Reply","Rating","Multiple Choice", "Instant Runoff Voting")|null
var/choice_amount = 0
switch(polltype)
if("Single Option")
@@ -48,6 +48,10 @@
choice_amount = input("How many choices should be allowed?","Select choice amount") as num|null
if(!choice_amount)
return
if ("Instant Runoff Voting")
polltype = POLLTYPE_IRV
else
return 0
var/starttime = SQLtime()
var/endtime = input("Set end time for poll as format YYYY-MM-DD HH:MM:SS. All times in server time. HH:MM:SS is optional and 24-hour. Must be later than starting time for obvious reasons.", "Set end time", SQLtime()) as text
if(!endtime)
@@ -117,14 +121,15 @@
if(!option)
return pollid
option = sanitizeSQL(option)
var/percentagecalc
switch(alert("Calculate option results as percentage?",,"Yes","No","Cancel"))
if("Yes")
percentagecalc = 1
if("No")
percentagecalc = 0
else
return pollid
var/percentagecalc = 1
if (polltype != POLLTYPE_IRV)
switch(alert("Calculate option results as percentage?",,"Yes","No","Cancel"))
if("Yes")
percentagecalc = 1
if("No")
percentagecalc = 0
else
return pollid
var/minval = 0
var/maxval = 0
var/descmin = ""
@@ -160,9 +165,11 @@
var/err = query_polladd_option.ErrorMsg()
log_game("SQL ERROR adding new poll option to table. Error : \[[err]\]\n")
return pollid
switch(alert(" ",,"Add option","Finish"))
switch(alert(" ",,"Add option","Finish", "Cancel"))
if("Add option")
add_option = 1
if("Finish")
add_option = 0
else
return 0
return pollid
+91 -87
View File
@@ -17,11 +17,11 @@
C << 'sound/effects/adminhelp.ogg'
C << "<font color='red' size='4'><b>- AdminHelp Rejected! -</b></font>"
C << "<font color='red'><b>Your admin help was rejected.</b> The adminhelp verb has been returned to you so that you may try again</font>"
C << "<font color='red'><b>Your admin help was rejected.</b> The adminhelp verb has been returned to you so that you may try again.</font>"
C << "Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting."
message_admins("[key_name_admin(usr)] Rejected [C.key]'s admin help. [C.key]'s Adminhelp verb has been returned to them")
log_admin("[key_name(usr)] Rejected [C.key]'s admin help")
message_admins("[key_name_admin(usr)] Rejected [C.key]'s admin help. [C.key]'s Adminhelp verb has been returned to them.")
log_admin("[key_name(usr)] Rejected [C.key]'s admin help.")
else if(href_list["stickyban"])
stickyban(href_list["stickyban"],href_list)
@@ -185,39 +185,39 @@
switch(bantype)
if(BANTYPE_PERMA)
if(!banckey || !banreason)
usr << "Not enough parameters (Requires ckey and reason)"
usr << "Not enough parameters (Requires ckey and reason)."
return
banduration = null
banjob = null
if(BANTYPE_TEMP)
if(!banckey || !banreason || !banduration)
usr << "Not enough parameters (Requires ckey, reason and duration)"
usr << "Not enough parameters (Requires ckey, reason and duration)."
return
banjob = null
if(BANTYPE_JOB_PERMA)
if(!banckey || !banreason || !banjob)
usr << "Not enough parameters (Requires ckey, reason and job)"
usr << "Not enough parameters (Requires ckey, reason and job)."
return
banduration = null
if(BANTYPE_JOB_TEMP)
if(!banckey || !banreason || !banjob || !banduration)
usr << "Not enough parameters (Requires ckey, reason and job)"
usr << "Not enough parameters (Requires ckey, reason and job)."
return
if(BANTYPE_APPEARANCE)
if(!banckey || !banreason)
usr << "Not enough parameters (Requires ckey and reason)"
usr << "Not enough parameters (Requires ckey and reason)."
return
banduration = null
banjob = null
if(BANTYPE_ADMIN_PERMA)
if(!banckey || !banreason)
usr << "Not enough parameters (Requires ckey and reason)"
usr << "Not enough parameters (Requires ckey and reason)."
return
banduration = null
banjob = null
if(BANTYPE_ADMIN_TEMP)
if(!banckey || !banreason || !banduration)
usr << "Not enough parameters (Requires ckey, reason and duration)"
usr << "Not enough parameters (Requires ckey, reason and duration)."
return
banjob = null
@@ -237,7 +237,7 @@
if(bancid)
banreason = "[banreason] (CUSTOM CID)"
else
message_admins("Ban process: A mob matching [playermob.ckey] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom ip and computer id fields replaced with the ip and computer id from the located mob")
message_admins("Ban process: A mob matching [playermob.ckey] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom ip and computer id fields replaced with the ip and computer id from the located mob.")
DB_ban_record(bantype, playermob, banduration, banreason, banjob, null, banckey, banip, bancid )
add_note(banckey, banreason, null, usr.ckey, 0)
@@ -255,8 +255,8 @@
if(EMERGENCY_AT_LEAST_DOCKED)
return
SSshuttle.emergency.request()
log_admin("[key_name(usr)] called the Emergency Shuttle")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] called the Emergency Shuttle to the station</span>")
log_admin("[key_name(usr)] called the Emergency Shuttle.")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] called the Emergency Shuttle to the station.</span>")
if("2")
if(EMERGENCY_AT_LEAST_DOCKED)
@@ -264,12 +264,12 @@
switch(SSshuttle.emergency.mode)
if(SHUTTLE_CALL)
SSshuttle.emergency.cancel()
log_admin("[key_name(usr)] sent the Emergency Shuttle back")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] sent the Emergency Shuttle back</span>")
log_admin("[key_name(usr)] sent the Emergency Shuttle back.")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] sent the Emergency Shuttle back.</span>")
else
SSshuttle.emergency.cancel()
log_admin("[key_name(usr)] called the Emergency Shuttle")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] called the Emergency Shuttle to the station</span>")
log_admin("[key_name(usr)] called the Emergency Shuttle.")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] called the Emergency Shuttle to the station.</span>")
href_list["secrets"] = "check_antagonist"
@@ -280,9 +280,9 @@
var/timer = input("Enter new shuttle duration (seconds):","Edit Shuttle Timeleft", SSshuttle.emergency.timeLeft() ) as num
SSshuttle.emergency.setTimer(timer*10)
log_admin("[key_name(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds")
log_admin("[key_name(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds.")
minor_announce("The emergency shuttle will reach its destination in [round(SSshuttle.emergency.timeLeft(600))] minutes.")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds</span>")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds.</span>")
href_list["secrets"] = "check_antagonist"
else if(href_list["toggle_continuous"])
@@ -373,7 +373,7 @@
var/mob/M = locate(href_list["mob"])
if(!ismob(M))
usr << "This can only be used on instances of type /mob"
usr << "This can only be used on instances of type /mob."
return
var/delmob = 0
@@ -383,8 +383,8 @@
if("Yes")
delmob = 1
log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]</span>")
log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]].; deletemob=[delmob]")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]].; deletemob=[delmob]</span>")
switch(href_list["simplemake"])
if("observer")
@@ -482,13 +482,13 @@
return
minutes = CMinutes + mins
duration = GetExp(minutes)
reason = input(usr,"Please State Reason","Reason",reason2) as message
reason = input(usr,"Please State Reason.","Reason",reason2) as message
if(!reason)
return
if("No")
temp = 0
duration = "Perma"
reason = input(usr,"Please State Reason","Reason",reason2) as message
reason = input(usr,"Please State Reason.","Reason",reason2) as message
if(!reason)
return
@@ -521,17 +521,17 @@
if(banreason)
switch(alert("Reason: '[banreason]' Remove appearance ban?","Please Confirm","Yes","No"))
if("Yes")
ban_unban_log_save("[key_name(usr)] removed [key_name(M)]'s appearance ban")
log_admin("[key_name(usr)] removed [key_name(M)]'s appearance ban")
ban_unban_log_save("[key_name(usr)] removed [key_name(M)]'s appearance ban.")
log_admin("[key_name(usr)] removed [key_name(M)]'s appearance ban.")
feedback_inc("ban_appearance_unban", 1)
DB_ban_unban(M.ckey, BANTYPE_APPEARANCE)
appearance_unban(M)
message_admins("<span class='adminnotice'>[key_name_admin(usr)] removed [key_name_admin(M)]'s appearance ban</span>")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] removed [key_name_admin(M)]'s appearance ban.</span>")
M << "<span class='boldannounce'><BIG>[usr.client.ckey] has removed your appearance ban.</BIG></span>"
else switch(alert("Appearance ban [M.ckey]?",,"Yes","No", "Cancel"))
if("Yes")
var/reason = input(usr,"Please State Reason","Reason") as message
var/reason = input(usr,"Please State Reason.","Reason") as message
if(!reason)
return
ban_unban_log_save("[key_name(usr)] appearance banned [key_name(M)]. reason: [reason]")
@@ -540,7 +540,7 @@
DB_ban_record(BANTYPE_APPEARANCE, M, -1, reason)
appearance_fullban(M, "[reason]; By [usr.ckey] on [time2text(world.realtime)]")
add_note(M.ckey, "Appearance banned - [reason]", null, usr.ckey, 0)
message_admins("<span class='adminnotice'>[key_name_admin(usr)] appearance banned [key_name_admin(M)]</span>")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] appearance banned [key_name_admin(M)].</span>")
M << "<span class='boldannounce'><BIG>You have been appearance banned by [usr.client.ckey].</BIG></span>"
M << "<span class='boldannounce'>The reason is: [reason]</span>"
M << "<span class='danger'>Appearance ban can be lifted only upon request.</span>"
@@ -554,11 +554,11 @@
else if(href_list["jobban2"])
var/mob/M = locate(href_list["jobban2"])
if(!ismob(M))
usr << "This can only be used on instances of type /mob"
usr << "This can only be used on instances of type /mob."
return
if(!M.ckey) //sanity
usr << "This mob has no ckey"
usr << "This mob has no ckey."
return
var/dat = ""
@@ -963,14 +963,14 @@
var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null
if(!mins)
return
var/reason = input(usr,"Please State Reason","Reason") as message
var/reason = input(usr,"Please State Reason.","Reason") as message
if(!reason)
return
var/msg
for(var/job in notbannedlist)
ban_unban_log_save("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes. reason: [reason]")
log_admin("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes")
log_admin("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes.")
feedback_inc("ban_job_tmp",1)
DB_ban_record(BANTYPE_JOB_TEMP, M, mins, reason, job)
if(M.client)
@@ -981,7 +981,7 @@
else
msg += ", [job]"
add_note(M.ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0)
message_admins("<span class='adminnotice'>[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes</span>")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes.</span>")
M << "<span class='boldannounce'><BIG>You have been jobbanned by [usr.client.ckey] from: [msg].</BIG></span>"
M << "<span class='boldannounce'>The reason is: [reason]</span>"
M << "<span class='danger'>This jobban will be lifted in [mins] minutes.</span>"
@@ -1004,7 +1004,7 @@
else
msg += ", [job]"
add_note(M.ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0)
message_admins("<span class='adminnotice'>[key_name_admin(usr)] banned [key_name_admin(M)] from [msg]</span>")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] banned [key_name_admin(M)] from [msg].</span>")
M << "<span class='boldannounce'><BIG>You have been jobbanned by [usr.client.ckey] from: [msg].</BIG></span>"
M << "<span class='boldannounce'>The reason is: [reason]</span>"
M << "<span class='danger'>Jobban can be lifted only upon request.</span>"
@@ -1037,7 +1037,7 @@
else
continue
if(msg)
message_admins("<span class='adminnotice'>[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg]</span>")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg].</span>")
M << "<span class='boldannounce'><BIG>You have been un-jobbanned by [usr.client.ckey] from [msg].</BIG></span>"
href_list["jobban2"] = 1 // lets it fall through and refresh
return 1
@@ -1115,7 +1115,7 @@
var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null
if(!mins)
return
var/reason = input(usr,"Please State Reason","Reason") as message
var/reason = input(usr,"Please State Reason.","Reason") as message
if(!reason)
return
AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins)
@@ -1135,7 +1135,7 @@
del(M.client)
//qdel(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends.
if("No")
var/reason = input(usr,"Please State Reason","Reason") as message
var/reason = input(usr,"Please State Reason.","Reason") as message
if(!reason)
return
switch(alert(usr,"IP ban?",,"Yes","No","Cancel"))
@@ -1272,11 +1272,11 @@
var/mob/living/carbon/human/H = locate(href_list["monkeyone"])
if(!istype(H))
usr << "This can only be used on instances of type /mob/living/carbon/human"
usr << "This can only be used on instances of type /mob/living/carbon/human."
return
log_admin("[key_name(usr)] attempting to monkeyize [key_name(H)]")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)]</span>")
log_admin("[key_name(usr)] attempting to monkeyize [key_name(H)].")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)].</span>")
H.monkeyize()
else if(href_list["humanone"])
@@ -1285,11 +1285,11 @@
var/mob/living/carbon/monkey/Mo = locate(href_list["humanone"])
if(!istype(Mo))
usr << "This can only be used on instances of type /mob/living/carbon/monkey"
usr << "This can only be used on instances of type /mob/living/carbon/monkey."
return
log_admin("[key_name(usr)] attempting to humanize [key_name(Mo)]")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] attempting to humanize [key_name_admin(Mo)]</span>")
log_admin("[key_name(usr)] attempting to humanize [key_name(Mo)].")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] attempting to humanize [key_name_admin(Mo)].</span>")
Mo.humanize()
else if(href_list["corgione"])
@@ -1298,11 +1298,11 @@
var/mob/living/carbon/human/H = locate(href_list["corgione"])
if(!istype(H))
usr << "This can only be used on instances of type /mob/living/carbon/human"
usr << "This can only be used on instances of type /mob/living/carbon/human."
return
log_admin("[key_name(usr)] attempting to corgize [key_name(H)]")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] attempting to corgize [key_name_admin(H)]</span>")
log_admin("[key_name(usr)] attempting to corgize [key_name(H)].")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] attempting to corgize [key_name_admin(H)].</span>")
H.corgize()
@@ -1312,7 +1312,7 @@
var/mob/M = locate(href_list["forcespeech"])
if(!ismob(M))
usr << "this can only be used on instances of type /mob"
usr << "this can only be used on instances of type /mob."
var/speech = input("What will [key_name(M)] say?.", "Force speech", "")// Don't need to sanitize, since it does that in say(), we also trust our admins.
if(!speech)
@@ -1328,10 +1328,10 @@
var/mob/M = locate(href_list["sendtoprison"])
if(!ismob(M))
usr << "This can only be used on instances of type /mob"
usr << "This can only be used on instances of type /mob."
return
if(istype(M, /mob/living/silicon/ai))
usr << "This cannot be used on instances of type /mob/living/silicon/ai"
usr << "This cannot be used on instances of type /mob/living/silicon/ai."
return
if(alert(usr, "Send [key_name(M)] to Prison?", "Message", "Yes", "No") != "Yes")
@@ -1376,10 +1376,10 @@
var/mob/M = locate(href_list["tdome1"])
if(!ismob(M))
usr << "This can only be used on instances of type /mob"
usr << "This can only be used on instances of type /mob."
return
if(istype(M, /mob/living/silicon/ai))
usr << "This cannot be used on instances of type /mob/living/silicon/ai"
usr << "This cannot be used on instances of type /mob/living/silicon/ai."
return
for(var/obj/item/I in M)
@@ -1406,10 +1406,10 @@
var/mob/M = locate(href_list["tdome2"])
if(!ismob(M))
usr << "This can only be used on instances of type /mob"
usr << "This can only be used on instances of type /mob."
return
if(istype(M, /mob/living/silicon/ai))
usr << "This cannot be used on instances of type /mob/living/silicon/ai"
usr << "This cannot be used on instances of type /mob/living/silicon/ai."
return
for(var/obj/item/I in M)
@@ -1436,10 +1436,10 @@
var/mob/M = locate(href_list["tdomeadmin"])
if(!ismob(M))
usr << "This can only be used on instances of type /mob"
usr << "This can only be used on instances of type /mob."
return
if(istype(M, /mob/living/silicon/ai))
usr << "This cannot be used on instances of type /mob/living/silicon/ai"
usr << "This cannot be used on instances of type /mob/living/silicon/ai."
return
M.Paralyse(5)
@@ -1459,10 +1459,10 @@
var/mob/M = locate(href_list["tdomeobserve"])
if(!ismob(M))
usr << "This can only be used on instances of type /mob"
usr << "This can only be used on instances of type /mob."
return
if(istype(M, /mob/living/silicon/ai))
usr << "This cannot be used on instances of type /mob/living/silicon/ai"
usr << "This cannot be used on instances of type /mob/living/silicon/ai."
return
for(var/obj/item/I in M)
@@ -1490,12 +1490,12 @@
var/mob/living/L = locate(href_list["revive"])
if(!istype(L))
usr << "This can only be used on instances of type /mob/living"
usr << "This can only be used on instances of type /mob/living."
return
L.revive(full_heal = 1, admin_revive = 1)
message_admins("<span class='danger'>Admin [key_name_admin(usr)] healed / revived [key_name_admin(L)]!</span>")
log_admin("[key_name(usr)] healed / Revived [key_name(L)]")
log_admin("[key_name(usr)] healed / Revived [key_name(L)].")
else if(href_list["makeai"])
if(!check_rights(R_SPAWN))
@@ -1503,11 +1503,11 @@
var/mob/living/carbon/human/H = locate(href_list["makeai"])
if(!istype(H))
usr << "This can only be used on instances of type /mob/living/carbon/human"
usr << "This can only be used on instances of type /mob/living/carbon/human."
return
message_admins("<span class='danger'>Admin [key_name_admin(usr)] AIized [key_name_admin(H)]!</span>")
log_admin("[key_name(usr)] AIized [key_name(H)]")
log_admin("[key_name(usr)] AIized [key_name(H)].")
H.AIize()
else if(href_list["makealien"])
@@ -1516,7 +1516,7 @@
var/mob/living/carbon/human/H = locate(href_list["makealien"])
if(!istype(H))
usr << "This can only be used on instances of type /mob/living/carbon/human"
usr << "This can only be used on instances of type /mob/living/carbon/human."
return
usr.client.cmd_admin_alienize(H)
@@ -1527,7 +1527,7 @@
var/mob/living/carbon/human/H = locate(href_list["makeslime"])
if(!istype(H))
usr << "This can only be used on instances of type /mob/living/carbon/human"
usr << "This can only be used on instances of type /mob/living/carbon/human."
return
usr.client.cmd_admin_slimeize(H)
@@ -1538,7 +1538,7 @@
var/mob/living/carbon/human/H = locate(href_list["makeblob"])
if(!istype(H))
usr << "This can only be used on instances of type /mob/living/carbon/human"
usr << "This can only be used on instances of type /mob/living/carbon/human."
return
usr.client.cmd_admin_blobize(H)
@@ -1550,7 +1550,7 @@
var/mob/living/carbon/human/H = locate(href_list["makerobot"])
if(!istype(H))
usr << "This can only be used on instances of type /mob/living/carbon/human"
usr << "This can only be used on instances of type /mob/living/carbon/human."
return
usr.client.cmd_admin_robotize(H)
@@ -1561,7 +1561,7 @@
var/mob/M = locate(href_list["makeanimal"])
if(istype(M, /mob/new_player))
usr << "This cannot be used on instances of type /mob/new_player"
usr << "This cannot be used on instances of type /mob/new_player."
return
usr.client.cmd_admin_animalize(M)
@@ -1571,8 +1571,8 @@
if(G)
var/newpoints = input("Set [G.name ] Gang's influence.","Set Influence",G.points) as null|num
if(newpoints)
message_admins("[key_name_admin(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints]</span>")
log_admin("[key_name(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints]</span>")
message_admins("[key_name_admin(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].</span>")
log_admin("[key_name(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].</span>")
G.points = newpoints
G.message_gangtools("Your gang now has [G.points] influence.")
@@ -1615,7 +1615,7 @@
else if(href_list["adminmoreinfo"])
var/mob/M = locate(href_list["adminmoreinfo"])
if(!ismob(M))
usr << "This can only be used on instances of type /mob"
usr << "This can only be used on instances of type /mob."
return
var/location_description = ""
@@ -1726,7 +1726,7 @@
var/mob/living/carbon/human/H = locate(href_list["adminspawncookie"])
if(!ishuman(H))
usr << "This can only be used on instances of type /mob/living/carbon/human"
usr << "This can only be used on instances of type /mob/living/carbon/human."
return
H.equip_to_slot_or_del( new /obj/item/weapon/reagent_containers/food/snacks/cookie(H), slot_l_hand )
@@ -1740,8 +1740,8 @@
H.update_inv_r_hand()//To ensure the icon appears in the HUD
else
H.update_inv_l_hand()
log_admin("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]")
message_admins("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]")
log_admin("[key_name(H)] got their cookie, spawned by [key_name(src.owner)].")
message_admins("[key_name(H)] got their cookie, spawned by [key_name(src.owner)].")
feedback_inc("admin_cookies_spawned",1)
H << "<span class='adminnotice'>Your prayers have been answered!! You received the <b>best cookie</b>!</span>"
H << 'sound/effects/pray_chaplain.ogg'
@@ -1756,11 +1756,13 @@
usr << "This can only be used on instances of type /mob/living/carbon/human"
return
if(!istype(H.ears, /obj/item/device/radio/headset))
usr << "The person you are trying to contact is not wearing a headset"
usr << "The person you are trying to contact is not wearing a headset."
return
message_admins("[src.owner] has started answering [key_name(H)]'s Centcomm request.")
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from Centcom", "")
if(!input)
message_admins("[src.owner] decided not to answer [key_name(H)]'s Centcomm request.")
return
src.owner << "You sent [input] to [H] via a secure channel."
@@ -1771,14 +1773,16 @@
else if(href_list["SyndicateReply"])
var/mob/living/carbon/human/H = locate(href_list["SyndicateReply"])
if(!istype(H))
usr << "This can only be used on instances of type /mob/living/carbon/human"
usr << "This can only be used on instances of type /mob/living/carbon/human."
return
if(!istype(H.ears, /obj/item/device/radio/headset))
usr << "The person you are trying to contact is not wearing a headset"
usr << "The person you are trying to contact is not wearing a headset."
return
message_admins("[src.owner] has started answering [key_name(H)]'s syndicate request.")
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from The Syndicate", "")
if(!input)
message_admins("[src.owner] decided not to answer [key_name(H)]'s syndicate request.")
return
src.owner << "You sent [input] to [H] via a secure channel."
@@ -1891,10 +1895,10 @@
paths += path
if(!paths)
alert("The path list you sent is empty")
alert("The path list you sent is empty.")
return
if(length(paths) > 5)
alert("Select fewer object types, (max 5)")
alert("Select fewer object types, (max 5).")
return
var/list/offset = splittext(href_list["offset"],",")
@@ -1988,7 +1992,7 @@
src.access_news_network()
else if(href_list["ac_set_channel_name"])
src.admincaster_feed_channel.channel_name = stripped_input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "")
src.admincaster_feed_channel.channel_name = stripped_input(usr, "Provide a Feed Channel Name.", "Network Channel Handler", "")
while (findtext(src.admincaster_feed_channel.channel_name," ") == 1)
src.admincaster_feed_channel.channel_name = copytext(src.admincaster_feed_channel.channel_name,2,lentext(src.admincaster_feed_channel.channel_name)+1)
src.access_news_network()
@@ -2006,7 +2010,7 @@
if(src.admincaster_feed_channel.channel_name == "" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]" || check )
src.admincaster_screen=7
else
var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel")
var/choice = alert("Please confirm Feed channel creation.","Network Channel Handler","Confirm","Cancel")
if(choice=="Confirm")
news_network.CreateFeedChannel(src.admincaster_feed_channel.channel_name, src.admin_signature, src.admincaster_feed_channel.locked, 1)
feedback_inc("newscaster_channels",1)
@@ -2018,11 +2022,11 @@
var/list/available_channels = list()
for(var/datum/newscaster/feed_channel/F in news_network.network_channels)
available_channels += F.channel_name
src.admincaster_feed_channel.channel_name = adminscrub(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels )
src.admincaster_feed_channel.channel_name = adminscrub(input(usr, "Choose receiving Feed Channel.", "Network Channel Handler") in available_channels )
src.access_news_network()
else if(href_list["ac_set_new_message"])
src.admincaster_feed_message.body = adminscrub(input(usr, "Write your Feed story", "Network Channel Handler", ""))
src.admincaster_feed_message.body = adminscrub(input(usr, "Write your Feed story.", "Network Channel Handler", ""))
while (findtext(src.admincaster_feed_message.returnBody(-1)," ") == 1)
src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.returnBody(-1),2,lentext(src.admincaster_feed_message.returnBody(-1))+1)
src.access_news_network()
@@ -2069,13 +2073,13 @@
src.access_news_network()
else if(href_list["ac_set_wanted_name"])
src.admincaster_wanted_message.criminal = adminscrub(input(usr, "Provide the name of the Wanted person", "Network Security Handler", ""))
src.admincaster_wanted_message.criminal = adminscrub(input(usr, "Provide the name of the Wanted person.", "Network Security Handler", ""))
while(findtext(src.admincaster_wanted_message.criminal," ") == 1)
src.admincaster_wanted_message.criminal = copytext(admincaster_wanted_message.criminal,2,lentext(admincaster_wanted_message.criminal)+1)
src.access_news_network()
else if(href_list["ac_set_wanted_desc"])
src.admincaster_wanted_message.body = adminscrub(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", ""))
src.admincaster_wanted_message.body = adminscrub(input(usr, "Provide the a description of the Wanted person and any other details you deem important.", "Network Security Handler", ""))
while (findtext(src.admincaster_wanted_message.body," ") == 1)
src.admincaster_wanted_message.body = copytext(src.admincaster_wanted_message.body,2,lentext(src.admincaster_wanted_message.body)+1)
src.access_news_network()
@@ -2097,7 +2101,7 @@
src.access_news_network()
else if(href_list["ac_cancel_wanted"])
var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel")
var/choice = alert("Please confirm Wanted Issue removal.","Network Security Handler","Confirm","Cancel")
if(choice=="Confirm")
news_network.deleteWanted()
src.admincaster_screen=17
@@ -2160,7 +2164,7 @@
src.access_news_network()
else if(href_list["ac_set_signature"])
src.admin_signature = adminscrub(input(usr, "Provide your desired signature", "Network Identity Handler", ""))
src.admin_signature = adminscrub(input(usr, "Provide your desired signature.", "Network Identity Handler", ""))
src.access_news_network()
else if(href_list["ac_del_comment"])
@@ -2207,7 +2211,7 @@
message_admins("[key_name_admin(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
log_admin("[key_name(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
else
usr << "You may only use this when the game is running"
usr << "You may only use this when the game is running."
else if(href_list["create_outfit"])
if(!check_rights(R_ADMIN))
+2 -2
View File
@@ -24,8 +24,8 @@
T.break_tile()
target << "<span class='userdanger'>You're hit by bluespace artillery!</span>"
log_admin("[target.name] has been hit by Bluespace Artillery fired by [usr]")
message_admins("[target.name] has been hit by Bluespace Artillery fired by [usr]")
log_admin("[key_name(target)] has been hit by Bluespace Artillery fired by [key_name(usr)]")
message_admins("[ADMIN_LOOKUPFLW(target)] has been hit by Bluespace Artillery fired by [ADMIN_LOOKUPFLW(usr)]")
if(target.health <= 1)
target.gib(1, 1)
-1
View File
@@ -573,7 +573,6 @@ var/global/list/g_fancy_list_of_types = null
if(!ishuman(M))
alert("Invalid mob")
return
//log_admin("[key_name(src)] has alienized [M.key].")
var/list/outfits = list("Naked","Custom","As Job...")
+7 -4
View File
@@ -15,8 +15,7 @@
/obj/item/device/assembly/igniter/Destroy()
qdel(sparks)
sparks = null
return ..()
. = ..()
/obj/item/device/assembly/igniter/activate()
if(!..())
@@ -27,8 +26,12 @@
sparks.start()
return 1
/obj/item/device/assembly/igniter/attack_self(mob/user)
activate()
add_fingerprint(user)
return
/obj/item/device/assembly/igniter/ignition_effect(atom/A, mob/user)
. = "<span class='notice'>[user] fiddles with [src], and manages to \
light [A].</span>"
activate()
add_fingerprint(user)
+127 -12
View File
@@ -4,6 +4,7 @@
#define FLAG_RETURN_TIME 200 // 20 seconds
#define INSTAGIB_RESPAWN 50 //5 seconds
#define DEFAULT_RESPAWN 150 //15 seconds
#define AMMO_DROP_LIFETIME 300
@@ -131,6 +132,8 @@
var/control_points = 0
var/control_points_to_win = 180
var/list/team_members = list()
var/list/spawned_mobs = list()
var/list/recently_dead_ckeys = list()
var/ctf_enabled = FALSE
var/ctf_gear = /datum/outfit/ctf
var/instagib_gear = /datum/outfit/ctf/instagib
@@ -157,6 +160,21 @@
poi_list.Remove(src)
..()
/obj/machinery/capture_the_flag/process()
for(var/i in spawned_mobs)
if(!i)
spawned_mobs -= i
continue
// Anyone in crit, automatically reap
var/mob/living/M = i
if(M.InCritical() || M.stat == DEAD)
ctf_dust_old(M)
else
// The changes that you've been hit with no shield but not
// instantly critted are low, but have some healing.
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
/obj/machinery/capture_the_flag/red
name = "Red CTF Controller"
icon_state = "syndbeacon"
@@ -177,11 +195,12 @@
if(ticker.current_state != GAME_STATE_PLAYING)
return
if(user.ckey in team_members)
if(user.mind.current && user.mind.current.timeofdeath + respawn_cooldown > world.time)
if(user.ckey in recently_dead_ckeys)
user << "It must be more than [respawn_cooldown/10] seconds from your last death to respawn!"
return
var/client/new_team_member = user.client
dust_old(user)
if(user.mind && user.mind.current)
ctf_dust_old(user.mind.current)
spawn_team_member(new_team_member)
return
@@ -196,15 +215,20 @@
return
team_members |= user.ckey
var/client/new_team_member = user.client
dust_old(user)
if(user.mind && user.mind.current)
ctf_dust_old(user.mind.current)
spawn_team_member(new_team_member)
/obj/machinery/capture_the_flag/proc/dust_old(mob/user)
if(user.mind && user.mind.current && user.mind.current.z == src.z)
new /obj/item/ammo_box/magazine/recharge/ctf (get_turf(user.mind.current))
new /obj/item/ammo_box/magazine/recharge/ctf (get_turf(user.mind.current))
user.mind.current.dust()
/obj/machinery/capture_the_flag/proc/ctf_dust_old(mob/living/body)
if(isliving(body) && body.z == src.z)
var/turf/T = get_turf(body)
new /obj/effect/ctf/ammo(T)
recently_dead_ckeys += body.ckey
addtimer(src, "clear_cooldown", respawn_cooldown, TRUE, body.ckey)
body.dust()
/obj/machinery/capture_the_flag/proc/clear_cooldown(var/ckey)
recently_dead_ckeys -= ckey
/obj/machinery/capture_the_flag/proc/spawn_team_member(client/new_team_member)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(get_turf(src))
@@ -212,6 +236,7 @@
M.key = new_team_member.key
M.faction += team
M.equipOutfit(ctf_gear)
spawned_mobs += M
/obj/machinery/capture_the_flag/Topic(href, href_list)
if(href_list["join"])
@@ -281,12 +306,15 @@
/obj/machinery/capture_the_flag/proc/stop_ctf()
ctf_enabled = FALSE
arena_cleared = FALSE
var/area/A = get_area(src)
for(var/i in mob_list)
var/mob/M = i
if((get_area(A) == A) && (M.ckey in team_members))
M.dust()
team_members.Cut()
spawned_mobs.Cut()
recently_dead_ckeys.Cut()
/obj/machinery/capture_the_flag/proc/instagib_mode()
for(var/obj/machinery/capture_the_flag/CTF in machines)
@@ -300,23 +328,43 @@
CTF.ctf_gear = initial(ctf_gear)
CTF.respawn_cooldown = DEFAULT_RESPAWN
/obj/item/weapon/gun/projectile/automatic/pistol/deagle/CTF
/obj/item/weapon/gun/projectile/automatic/pistol/deagle/ctf
desc = "This looks like it could really hurt in melee."
force = 75
/obj/item/weapon/gun/projectile/automatic/pistol/deagle/ctf/dropped()
. = ..()
addtimer(src, "floor_vanish", 1)
/obj/item/weapon/gun/projectile/automatic/pistol/deagle/ctf/proc/floor_vanish()
if(isturf(loc))
qdel(src)
/obj/item/weapon/gun/projectile/automatic/laser/ctf
mag_type = /obj/item/ammo_box/magazine/recharge/ctf
desc = "This looks like it could really hurt in melee."
force = 50
flags = NODROP | DROPDEL
/obj/item/ammo_box/magazine/recharge/ctf
ammo_type = /obj/item/ammo_casing/caseless/laser/ctf
/obj/item/ammo_box/magazine/recharge/ctf/dropped()
. = ..()
addtimer(src, "floor_vanish", 1)
/obj/item/ammo_box/magazine/recharge/ctf/proc/floor_vanish()
if(isturf(loc))
qdel(src)
/obj/item/ammo_casing/caseless/laser/ctf
projectile_type = /obj/item/projectile/beam/ctf
/obj/item/projectile/beam/ctf
damage = 150
icon_state = "omnilaser"
// RED TEAM GUNS
/obj/item/weapon/gun/projectile/automatic/laser/ctf/red
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/red
@@ -330,6 +378,8 @@
/obj/item/projectile/beam/ctf/red
icon_state = "laser"
// BLUE TEAM GUNS
/obj/item/weapon/gun/projectile/automatic/laser/ctf/blue
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/blue
@@ -344,17 +394,35 @@
/datum/outfit/ctf
name = "CTF"
/obj/item/device/radio/headset
ears = /obj/item/device/radio/headset
uniform = /obj/item/clothing/under/syndicate
suit = /obj/item/clothing/suit/space/hardsuit/shielded/ctf
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
id = /obj/item/weapon/card/id/syndicate
belt = /obj/item/weapon/gun/projectile/automatic/pistol/deagle/CTF
belt = /obj/item/weapon/gun/projectile/automatic/pistol/deagle/ctf
l_pocket = /obj/item/ammo_box/magazine/recharge/ctf
r_pocket = /obj/item/ammo_box/magazine/recharge/ctf
r_hand = /obj/item/weapon/gun/projectile/automatic/laser/ctf
/datum/outfit/ctf/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE)
if(visualsOnly)
return
var/list/no_drops = list()
var/obj/item/weapon/card/id/W = H.wear_id
no_drops += W
W.registered_name = H.real_name
W.update_label(W.registered_name, W.assignment)
// The shielded hardsuit is already NODROP
no_drops += H.get_item_by_slot(slot_gloves)
no_drops += H.get_item_by_slot(slot_shoes)
no_drops += H.get_item_by_slot(slot_w_uniform)
no_drops += H.get_item_by_slot(slot_ears)
for(var/i in no_drops)
var/obj/item/I = i
I.flags |= NODROP
/datum/outfit/ctf/instagib
r_hand = /obj/item/weapon/gun/energy/laser/instakill
shoes = /obj/item/clothing/shoes/jackboots/fast
@@ -363,6 +431,8 @@
ears = /obj/item/device/radio/headset/syndicate/alt
suit = /obj/item/clothing/suit/space/hardsuit/shielded/ctf/red
r_hand = /obj/item/weapon/gun/projectile/automatic/laser/ctf/red
l_pocket = /obj/item/ammo_box/magazine/recharge/ctf/red
r_pocket = /obj/item/ammo_box/magazine/recharge/ctf/red
/datum/outfit/ctf/red/instagib
r_hand = /obj/item/weapon/gun/energy/laser/instakill/red
@@ -372,17 +442,21 @@
ears = /obj/item/device/radio/headset/headset_cent/commander
suit = /obj/item/clothing/suit/space/hardsuit/shielded/ctf/blue
r_hand = /obj/item/weapon/gun/projectile/automatic/laser/ctf/blue
l_pocket = /obj/item/ammo_box/magazine/recharge/ctf/blue
r_pocket = /obj/item/ammo_box/magazine/recharge/ctf/blue
/datum/outfit/ctf/blue/instagib
r_hand = /obj/item/weapon/gun/energy/laser/instakill/blue
shoes = /obj/item/clothing/shoes/jackboots/fast
/datum/outfit/ctf/red/post_equip(mob/living/carbon/human/H)
..()
var/obj/item/device/radio/R = H.ears
R.set_frequency(SYND_FREQ)
R.freqlock = 1
/datum/outfit/ctf/blue/post_equip(mob/living/carbon/human/H)
..()
var/obj/item/device/radio/R = H.ears
R.set_frequency(CENTCOM_FREQ)
R.freqlock = 1
@@ -406,7 +480,7 @@
/obj/structure/divine/trap/ctf/trap_effect(mob/living/L)
if(!(src.team in L.faction))
L << "<span class='danger'><B>Stay out of the enemy spawn!</B></span>"
L.dust()
L.death()
/obj/structure/divine/trap/ctf/red
@@ -430,7 +504,48 @@
invisibility = INVISIBILITY_OBSERVER
alpha = 100
/obj/effect/ctf/ammo
name = "ammo pickup"
desc = "You like revenge, right? Everybody likes revenge! Well, \
let's go get some!"
icon = 'icons/effects/effects.dmi'
icon_state = "at_shield1"
layer = ABOVE_MOB_LAYER
alpha = 255
invisibility = 0
/obj/effect/ctf/ammo/New()
..()
QDEL_IN(src, AMMO_DROP_LIFETIME)
/obj/effect/ctf/ammo/Crossed(atom/movable/AM)
reload(AM)
/obj/effect/ctf/ammo/Bump(atom/movable/AM)
reload(AM)
/obj/effect/ctf/ammo/Bumped(atom/movable/AM)
reload(AM)
/obj/effect/ctf/ammo/proc/reload(mob/living/M)
if(!ishuman(M))
return
for(var/obj/machinery/capture_the_flag/CTF in machines)
if(M in CTF.spawned_mobs)
var/outfit = CTF.ctf_gear
var/datum/outfit/O = new outfit
for(var/obj/item/weapon/gun/G in M)
M.unEquip(G)
qdel(G)
O.equip(M)
M << "<span class='notice'>Ammunition reloaded!</span>"
playsound(get_turf(M), 'sound/weapons/shotgunpump.ogg', 50, 1, -1)
qdel(src)
break
/obj/effect/ctf/dead_barricade
name = "dead barrier"
desc = "It provided cover in fire fights. And now it's gone."
icon = 'icons/obj/objects.dmi'
icon_state = "barrier0"
+27 -26
View File
@@ -17,58 +17,59 @@
name = "Lumbermill"
icon_state = "away3"
/*Cabin code*/
/obj/structure/fireplace
name = "fireplace"
/obj/structure/firepit
name = "firepit"
desc = "warm and toasty"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "fireplace-active"
icon = 'icons/obj/fireplace.dmi'
icon_state = "firepit-active"
density = 0
var/active = 1
/obj/structure/fireplace/initialize()
/obj/structure/firepit/initialize()
..()
toggleFireplace()
toggleFirepit()
/obj/structure/fireplace/attack_hand(mob/living/user)
/obj/structure/firepit/attack_hand(mob/living/user)
if(active)
active = 0
toggleFireplace()
toggleFirepit()
else
..()
/obj/structure/fireplace/attackby(obj/item/W,mob/living/user,params)
/obj/structure/firepit/attackby(obj/item/W,mob/living/user,params)
if(!active)
if(W.is_hot())
active = 1
toggleFireplace()
var/msg = W.ignition_effect(src, user)
if(msg)
active = TRUE
visible_message(msg)
toggleFirepit()
else
return ..()
else
W.fire_act()
/obj/structure/fireplace/proc/toggleFireplace()
/obj/structure/firepit/proc/toggleFirepit()
if(active)
SetLuminosity(8)
icon_state = "fireplace-active"
icon_state = "firepit-active"
else
SetLuminosity(0)
icon_state = "fireplace"
icon_state = "firepit"
/obj/structure/fireplace/extinguish()
/obj/structure/firepit/extinguish()
if(active)
active = 0
toggleFireplace()
active = FALSE
toggleFirepit()
/obj/structure/fireplace/fire_act()
/obj/structure/firepit/fire_act()
if(!active)
active = 1
toggleFireplace()
active = TRUE
toggleFirepit()
//other Cabin Stuff//
/obj/machinery/recycler/lumbermill
name = "lumbermill saw"
+5
View File
@@ -224,6 +224,11 @@ You can set verify to TRUE if you want send() to sleep until the client has the
"large_stamp-law.png" = 'icons/stamp_icons/large_stamp-law.png'
)
/datum/asset/simple/IRV
assets = list(
"jquery-ui.custom-core-widgit-mouse-sortable-min.js" = 'html/IRV/jquery-ui.custom-core-widgit-mouse-sortable-min.js',
"jquery-1.10.2.min.js" = 'html/IRV/jquery-1.10.2.min.js'
)
//Registers HTML Interface assets.
/datum/asset/HTML_interface/register()
+21 -18
View File
@@ -4,6 +4,7 @@
var/list/categories = list(CAT_WEAPON,CAT_AMMO,CAT_ROBOT,CAT_FOOD,CAT_MISC,CAT_PRIMAL)
var/datum/action/innate/crafting/button
var/display_craftable_only = FALSE
var/display_compact = FALSE
@@ -239,24 +240,26 @@
/datum/personal_crafting/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = not_incapacitated_turf_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "personal_crafting", "Crafting Menu", 600, 800, master_ui, state)
ui = new(user, src, ui_key, "personal_crafting", "Crafting Menu", 700, 800, master_ui, state)
ui.open()
/datum/personal_crafting/ui_data(mob/user)
var/list/data = list()
var/cur_category = categories[viewing_category]
data["busy"] = busy
data["prev_cat"] = categories[prev_cat()]
data["category"] = categories[viewing_category]
data["category"] = cur_category
data["next_cat"] = categories[next_cat()]
data["display_craftable_only"] = display_craftable_only
data["display_compact"] = display_compact
var/list/surroundings = get_surroundings(user)
var/list/can_craft = list()
var/list/cant_craft = list()
for(var/rec in crafting_recipes)
var/datum/crafting_recipe/R = rec
if(R.category != categories[viewing_category])
if(R.category != cur_category)
continue
if(check_contents(R, surroundings))
can_craft += list(build_recipe_data(R))
@@ -294,6 +297,10 @@
display_craftable_only = !display_craftable_only
usr << "<span class='notice'>You will now [display_craftable_only ? "only see recipes you can craft":"see all recipes"].</span>"
. = TRUE
if("toggle_compact")
display_compact = !display_compact
usr << "<span class='notice'>Crafting menu is now [display_compact? "compact" : "full size"].</span>"
. = TRUE
//Next works nicely with modular arithmetic
@@ -318,27 +325,23 @@
var/tool_text = ""
var/catalyst_text = ""
for(var/A in R.reqs)
if(ispath(A, /obj))
var/obj/O = A
req_text += " [R.reqs[A]] [initial(O.name)],"
else if(ispath(A, /datum/reagent))
var/datum/reagent/RE = A
req_text += " [R.reqs[A]] [initial(RE.name)],"
for(var/a in R.reqs)
//We just need the name, so cheat-typecast to /atom for speed (even tho Reagents are /datum they DO have a "name" var)
//Also these are typepaths so sadly we can't just do "[a]"
var/atom/A = a
req_text += " [R.reqs[A]] [initial(A.name)],"
req_text = replacetext(req_text,",","",-1)
data["req_text"] = req_text
for(var/C in R.chem_catalysts)
if(ispath(C, /datum/reagent))
var/datum/reagent/RE = C
catalyst_text += " [R.chem_catalysts[C]] [initial(RE.name)],"
for(var/a in R.chem_catalysts)
var/atom/A = a //cheat-typecast
catalyst_text += " [R.chem_catalysts[A]] [initial(A.name)],"
catalyst_text = replacetext(catalyst_text,",","",-1)
data["catalyst_text"] = catalyst_text
for(var/O in R.tools)
if(ispath(O, /obj))
var/obj/T = O
tool_text += " [R.tools[O]] [initial(T.name)],"
for(var/a in R.tools)
var/atom/A = a //cheat-typecast
tool_text += " [R.tools[A]] [initial(A.name)],"
tool_text = replacetext(tool_text,",","",-1)
data["tool_text"] = tool_text
+82 -41
View File
@@ -109,23 +109,36 @@
/turf/open/floor/vines/ChangeTurf(turf/open/floor/T)
for(var/obj/effect/spacevine/SV in src)
qdel(SV)
..()
. = ..()
UpdateAffectingLights()
/datum/spacevine_mutation/space_covering
var/static/list/coverable_turfs
/datum/spacevine_mutation/space_covering/New()
. = ..()
if(!coverable_turfs)
coverable_turfs = typecacheof(list(
/turf/open/space
))
coverable_turfs -= typecacheof(list(
/turf/open/space/transit
))
/datum/spacevine_mutation/space_covering/on_grow(obj/effect/spacevine/holder)
if(istype(holder.loc, /turf/open/space))
var/turf/open/spaceturf = holder.loc
spaceturf.ChangeTurf(/turf/open/floor/vines)
process_mutation(holder)
/datum/spacevine_mutation/space_covering/process_mutation(obj/effect/spacevine/holder)
if(istype(holder.loc, /turf/open/space))
var/turf/open/spaceturf = holder.loc
spaceturf.ChangeTurf(/turf/open/floor/vines)
var/turf/T = get_turf(holder)
if(is_type_in_typecache(T, coverable_turfs))
var/currtype = T.type
T.ChangeTurf(/turf/open/floor/vines)
T.baseturf = currtype
/datum/spacevine_mutation/space_covering/on_death(obj/effect/spacevine/holder)
if(istype(holder.loc, /turf/open/floor/vines))
var/turf/open/spaceturf = holder.loc
spaceturf.ChangeTurf(/turf/open/space)
var/turf/T = get_turf(holder)
if(istype(T, /turf/open/floor/vines))
T.ChangeTurf(T.baseturf)
/datum/spacevine_mutation/bluespace
name = "bluespace"
@@ -155,12 +168,13 @@
/datum/spacevine_mutation/toxicity/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
if(issilicon(crosser))
return
if(prob(severity) && istype(crosser))
if(prob(severity) && istype(crosser) && !isvineimmune(crosser))
crosser << "<span class='alert'>You accidently touch the vine and feel a strange sensation.</span>"
crosser.adjustToxLoss(5)
/datum/spacevine_mutation/toxicity/on_eat(obj/effect/spacevine/holder, mob/living/eater)
eater.adjustToxLoss(5)
if(!isvineimmune(eater))
eater.adjustToxLoss(5)
/datum/spacevine_mutation/explosive //OH SHIT IT CAN CHAINREACT RUN!!!
name = "explosive"
@@ -173,8 +187,7 @@
qdel(src)
else
. = 1
spawn(5)
qdel(src)
QDEL_IN(src, 5)
/datum/spacevine_mutation/explosive/on_death(obj/effect/spacevine/holder, mob/hitter, obj/item/I)
explosion(holder.loc, 0, 0, severity, 0, 0)
@@ -190,6 +203,8 @@
/datum/spacevine_mutation/fire_proof/on_hit(obj/effect/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
if(I && I.damtype == "fire")
. = 0
else
. = expected_damage
/datum/spacevine_mutation/vine_eating
name = "vine eating"
@@ -208,10 +223,10 @@
quality = NEGATIVE
/datum/spacevine_mutation/aggressive_spread/on_spread(obj/effect/spacevine/holder, turf/target)
target.ex_act(severity, src)
target.ex_act(severity, src) // vine immunity handled at /mob/ex_act
/datum/spacevine_mutation/aggressive_spread/on_buckle(obj/effect/spacevine/holder, mob/living/buckled)
buckled.ex_act(severity)
buckled.ex_act(severity, src)
/datum/spacevine_mutation/transparency
name = "transparent"
@@ -289,16 +304,17 @@
quality = NEGATIVE
/datum/spacevine_mutation/thorns/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
if(prob(severity) && istype(crosser))
if(prob(severity) && istype(crosser) && !isvineimmune(holder))
var/mob/living/M = crosser
M.adjustBruteLoss(5)
M << "<span class='alert'>You cut yourself on the thorny vines.</span>"
/datum/spacevine_mutation/thorns/on_hit(obj/effect/spacevine/holder, mob/living/hitter)
if(prob(severity) && istype(hitter))
/datum/spacevine_mutation/thorns/on_hit(obj/effect/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
if(prob(severity) && istype(hitter) && !isvineimmune(holder))
var/mob/living/M = hitter
M.adjustBruteLoss(5)
M << "<span class='alert'>You cut yourself on the thorny vines.</span>"
. = expected_damage
/datum/spacevine_mutation/woodening
name = "hardened"
@@ -308,15 +324,14 @@
/datum/spacevine_mutation/woodening/on_grow(obj/effect/spacevine/holder)
if(holder.energy)
holder.density = 1
holder.maxhealth = 100
holder.health = holder.maxhealth
/datum/spacevine_mutation/woodening/on_hit(obj/effect/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
if(!expected_damage)
return
if(hitter)
if(I)
. = I.force * 2
else
. = 8
/datum/spacevine_mutation/woodening/on_hit(obj/effect/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
if(I.is_sharp())
. = expected_damage * 0.5
else
. = expected_damage
/datum/spacevine_mutation/flowering
name = "flowering"
@@ -343,6 +358,8 @@
layer = SPACEVINE_LAYER
mouse_opacity = 2 //Clicking anywhere on the turf is good enough
pass_flags = PASSTABLE | PASSGRILLE
var/health = 50
var/maxhealth = 50
var/energy = 0
var/obj/effect/spacevine_controller/master = null
var/list/mutations = list()
@@ -385,22 +402,33 @@
if (!W || !user || !W.type)
return
user.changeNext_move(CLICK_CD_MELEE)
var/force = W.force
var/override = W.force
if(W.is_sharp())
override = 100
if(istype(W, /obj/item/weapon/scythe))
var/local_override = override
force = force * 4
for(var/obj/effect/spacevine/B in orange(1,src))
for(var/datum/spacevine_mutation/SM in mutations)
local_override = SM.on_hit(src, user, W, local_override)
if(prob(local_override))
qdel(B)
B.health = health - force
if(B.health < 1)
qdel(B)
health = health - force
if(health < 1)
qdel(src)
return
if(W.is_sharp())
force = force * 4
if(W && W.damtype == "fire")
force = force * 4
for(var/datum/spacevine_mutation/SM in mutations)
override = SM.on_hit(src, user, W, override) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
force = SM.on_hit(src, user, W, force) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
if(prob(override))
health = health - force
if(health < 1)
qdel(src)
..()
@@ -482,7 +510,7 @@
/obj/effect/spacevine_controller/process()
if(!vines)
qdel(src) //space vines exterminated. Remove the controller
qdel(src) //space vines exterminated. Remove the controller
return
if(!growth_queue)
qdel(src) //Sanity check
@@ -494,7 +522,7 @@
var/i = 0
var/list/obj/effect/spacevine/queue_end = list()
for( var/obj/effect/spacevine/SV in growth_queue )
for(var/obj/effect/spacevine/SV in growth_queue)
if(qdeleted(SV))
continue
i++
@@ -531,12 +559,12 @@
if(!has_buckled_mobs() && prob(25))
for(var/mob/living/V in src.loc)
entangle(V)
if(buckled_mobs.len)
if(buckled_mobs && buckled_mobs.len)
break //only capture one mob at a time
/obj/effect/spacevine/proc/entangle(mob/living/V)
if(!V)
if(!V || isvineimmune(V))
return
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_buckle(src, V)
@@ -570,3 +598,16 @@
override += SM.process_temperature(src, temp, volume)
if(!override)
qdel(src)
/obj/effect/spacevine/CanPass(atom/movable/mover, turf/target, height=0)
if(isvineimmune(mover))
. = TRUE
else
. = ..()
/proc/isvineimmune(atom/A)
. = FALSE
if(isliving(A))
var/mob/living/M = A
if(("vines" in M.faction) || ("plants" in M.faction))
. = TRUE
@@ -212,7 +212,6 @@
var/datum/browser/popup = new(user, "microwave", name, 300, 300)
popup.set_content(dat)
popup.open()
return
/***********************************
* Microwave Menu Handling/Cooking
@@ -340,4 +339,3 @@
if ("dispose")
dispose()
updateUsrDialog()
return
+2 -2
View File
@@ -34,7 +34,7 @@
// Stronger reagents must always come first to avoid being displaced by weaker ones.
// Total amount of any reagent in plant is calculated by formula: 1 + round(potency * multiplier)
var/innate_yieldmod = 1 //modifier for yield, seperate to the one in Hydro trays, as that one is SPECIFICALLY for nutriment/chems (which means it's constantly reset)
var/innate_yieldmod = 0 //modifier for yield, seperate to the one in Hydro trays, as that one is SPECIFICALLY for nutriment/chems (which means it's constantly reset)
//This is added onto the yield mod of the hydro tray, yield *= (parent.yieldmod+innate_yieldmod)
var/weed_rate = 1 //If the chance below passes, then this many weeds sprout during growth
@@ -269,4 +269,4 @@
if(seed.icon_harvest) // mushrooms have no grown sprites, same for items with no product
if(!(seed.icon_harvest in states))
world << "[seed.name] ([seed.type]) lacks the [seed.icon_harvest] icon!"
world << "[seed.name] ([seed.type]) lacks the [seed.icon_harvest] icon!"
+3 -2
View File
@@ -790,6 +790,7 @@
name = "necropolis wall"
desc = "A seemingly impenetrable wall."
icon = 'icons/turf/walls.dmi'
icon_state = "necro"
explosion_block = 50
baseturf = /turf/closed/indestructible/necropolis
@@ -797,10 +798,10 @@
name = "necropolis floor"
desc = "It's regarding you suspiciously."
icon = 'icons/turf/floors.dmi'
icon_state = "floor"
icon_state = "necro1"
baseturf = /turf/open/indestructible/necropolis
/turf/open/indestructible/necropolis/New()
..()
if(prob(12))
icon_state = "necropolis[rand(1,2)]"
icon_state = "necro[rand(2,3)]"
+1
View File
@@ -72,6 +72,7 @@
var/forceProcess = 0
var/processTime = 8
var/lastProc = 0
var/showexaminetext = 1 //If we show our telltale examine text
var/list/knownStrings = list()
@@ -33,8 +33,7 @@
ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
. = ..(gibbed)
if(mind && mind.devilinfo)
spawn(0)
mind.devilinfo.beginResurrectionCheck(src)
addtimer(mind.devilinfo, "beginResurrectionCheck", 0, FALSE, src)
/mob/living/carbon/human/proc/makeSkeleton()
status_flags |= DISFIGURED
@@ -289,7 +289,9 @@
if(getorgan(/obj/item/organ/brain))
if(istype(src,/mob/living/carbon/human/interactive))
msg += "<span class='deadsay'>[t_He] [t_is] appears to be some sort of sick automaton, [t_his] eyes are glazed over and [t_his] mouth is slightly agape.</span>\n"
var/mob/living/carbon/human/interactive/auto = src
if(auto.showexaminetext)
msg += "<span class='deadsay'>[t_He] [t_is] appears to be some sort of sick automaton, [t_his] eyes are glazed over and [t_his] mouth is slightly agape.</span>\n"
else if(!key)
msg += "<span class='deadsay'>[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely.</span>\n"
else if(!client)
@@ -120,6 +120,8 @@
var/b_loss = null
var/f_loss = null
var/bomb_armor = getarmor(null, "bomb")
if(istype(ex_target, /datum/spacevine_mutation) && isvineimmune(src))
return
switch (severity)
if (1)
@@ -104,6 +104,15 @@
heatmod = 1.5
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/plant
/datum/species/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
C.faction |= "plants"
C.faction |= "vines"
/datum/species/pod/on_species_loss(mob/living/carbon/C)
. = ..()
C.faction -= "plants"
C.faction -= "vines"
/datum/species/pod/spec_life(mob/living/carbon/human/H)
if(H.stat == DEAD)
@@ -146,8 +155,6 @@
H.show_message("<span class='userdanger'>The radiation beam singes you!</span>")
if(/obj/item/projectile/energy/florayield)
H.nutrition = min(H.nutrition+30, NUTRITION_LEVEL_FULL)
return
/*
SHADOWPEOPLE
+2
View File
@@ -54,7 +54,9 @@
message_type=DEADCHAT_DEATHRATTLE)
if(mind)
mind.store_memory("Time of death: [tod]", 0)
var/list/scripture_states = get_scripture_states()
living_mob_list -= src
scripture_unlock_alert(scripture_states)
if(!gibbed)
dead_mob_list += src
else if(buckled)
+3 -1
View File
@@ -225,7 +225,9 @@ Sorry Giacom. Please don't be mad :(
/mob/living/proc/InCritical()
return (src.health < 0 && src.health > -95 && stat == UNCONSCIOUS)
/mob/living/ex_act(severity, target)
/mob/living/ex_act(severity, origin)
if(istype(origin, /datum/spacevine_mutation) && isvineimmune(src))
return
..()
flash_eyes()
+27 -8
View File
@@ -45,7 +45,6 @@ var/list/ai_list = list()
//MALFUNCTION
var/datum/module_picker/malf_picker
var/list/datum/AI_Module/current_modules = list()
var/fire_res_on_core = 0
var/can_dominate_mechs = 0
var/shunted = 0 //1 if the AI is currently shunted. Used to differentiate between shunted and ghosted/braindead
@@ -157,7 +156,9 @@ var/list/ai_list = list()
shuttle_caller_list -= src
SSshuttle.autoEvac()
qdel(eyeobj) // No AI, no Eye
return ..()
malfhack = null
. = ..()
/mob/living/silicon/ai/verb/pick_icon()
@@ -320,8 +321,6 @@ var/list/ai_list = list()
if(C)
C.post_status("shuttle")
return
/mob/living/silicon/ai/cancel_camera()
src.view_core()
@@ -385,8 +384,6 @@ var/list/ai_list = list()
if (stat != DEAD)
adjustBruteLoss(30)
return
/mob/living/silicon/ai/Topic(href, href_list)
if(usr != src)
return
@@ -470,7 +467,6 @@ var/list/ai_list = list()
return
..()
return
/mob/living/silicon/ai/proc/switchCamera(obj/machinery/camera/C)
@@ -746,7 +742,6 @@ var/list/ai_list = list()
light_cameras()
src << "Camera lights activated."
return
//AI_CAMERA_LUMINOSITY
@@ -898,3 +893,27 @@ var/list/ai_list = list()
if(..()) //successfully ressuscitated from death
icon_state = "ai"
. = 1
/mob/living/silicon/ai/proc/malfhacked(obj/machinery/power/apc/apc)
malfhack = null
malfhacking = FALSE
if(!istype(apc) || qdeleted(apc) || apc.stat & BROKEN)
src << "Hack aborted. The designated APC no longer exists on the \
power network."
playsound(get_turf(src), 'sound/machines/buzz-two.ogg', 50, 1)
else if(apc.aidisabled)
src << "Hack aborted. \The [apc] is no longer responding \
to our systems."
playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 50, 1)
else
malf_picker.processing_time += 10
apc.malfai = parent || src
apc.malfhack = TRUE
apc.locked = TRUE
playsound(get_turf(src), 'sound/machines/ding.ogg', 50, 1)
src << "Hack complete. \The [apc] is now under your \
exclusive control."
apc.update_icon()
+1 -3
View File
@@ -49,9 +49,7 @@
/mob/living/silicon/ai/updatehealth()
if(status_flags & GODMODE)
return
health = maxHealth - getOxyLoss() - getToxLoss() - getBruteLoss()
if(!fire_res_on_core)
health -= getFireLoss()
health = maxHealth - getOxyLoss() - getToxLoss() - getBruteLoss() - getFireLoss()
update_stat()
diag_hud_set_health()
@@ -138,4 +138,4 @@
return //we don't get hacked or give a shit about it
/mob/living/simple_animal/drone/cogscarab/drone_chat(msg)
send_hierophant_message(src, msg, "heavy_alloy") //HIEROPHANT DRONES
titled_hierophant_message(src, msg, "heavy_alloy") //HIEROPHANT DRONES
@@ -232,6 +232,13 @@
else if(target != null && prob(40))//No more pulling a mob forever and having a second player attack it, it can switch targets now if it finds a more suitable one
FindTarget()
/mob/living/simple_animal/hostile/UnarmedAttack(atom/A)
target = A
if(dextrous)
..()
else
AttackingTarget()
/mob/living/simple_animal/hostile/proc/AttackingTarget()
target.attack_animal(src)
@@ -1,3 +1,26 @@
/*
BUBBLEGUM
Bubblegum spawns randomly wherever a lavaland creature is able to spawn. It is the most powerful slaughter demon in existence.
Bubblegum's footsteps are heralded by shaking booms, proving its tremendous size.
It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage.
It often charges, dealing massive damage to anything unfortunate enough to be standing where it's aiming.
Whenever it isn't chasing something down, it will sink into nearby blood pools (if possible) and springs out of the closest one to its target.
To make this possible, it sprays streams of blood at random.
From these blood pools Bubblegum may summon slaughterlings - weak, low-damage minions designed to impede the target's progress.
When Bubblegum dies, it leaves behind a chest that can contain three things:
1. A slaughter demon spawner
2. A bottle that, when activated, drives everyone nearby into a frenzy
3. A contract that marks for death the chosen target
Difficulty: Hard
*/
/mob/living/simple_animal/hostile/megafauna/bubblegum
name = "bubblegum"
desc = "In what passes for a heirarchy among slaughter demons, this one is king."
@@ -1,3 +1,26 @@
/*
COLOSSUS
The colossus spawns randomly wherever a lavaland creature is able to spawn. It is powerful, ancient, and extremely deadly.
The colossus has a degree of sentience, proving this in speech during its attacks.
It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage.
The colossus' true danger lies in its ranged capabilities. It fires immensely damaging death bolts that penetrate all armor in a variety of ways:
1. The colossus fires death bolts in alternating patterns: the cardinal directions and the diagonal directions.
2. The colossus fires death bolts in a shotgun-like pattern, instantly downing anything unfortunate enough to be hit by all of them.
3. The colossus fires a spiral of death bolts.
At 33% health, the colossus gains an additional attack:
4. The colossus fires two spirals of death bolts, spinning in opposite directions.
When a colossus dies, it leaves behind a chunk of glowing crystal known as a black box. Anything placed inside will carry over into future rounds.
For instance, you could place a bag of holding into the black box, and then kill another colossus next round and retrieve the bag of holding from inside.
Difficulty: Very Hard
*/
/mob/living/simple_animal/hostile/megafauna/colossus
name = "colossus"
desc = "A monstrous creature protected by heavy shielding."
@@ -1,3 +1,28 @@
/*
ASH DRAKE
Ash drakes spawn randomly wherever a lavaland creature is able to spawn. They are the draconic guardians of the Necropolis.
It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage.
Whenever possible, the drake will breathe fire in the four cardinal directions, igniting and heavily damaging anything caught in the blast.
It also often causes fire to rain from the sky - many nearby turfs will flash red as a fireball crashes into them, dealing damage to anything on the turfs.
The drake also utilizes its wings to fly into the sky and crash down onto a specified point. Anything on this point takes tremendous damage.
- Sometimes it will chain these swooping attacks over and over, making swiftness a necessity.
When an ash drake dies, it leaves behind a chest that can contain four things:
1. A spectral blade that allows its wielder to call ghosts to it, enhancing its power
2. A lava staff that allows its wielder to create lava
3. A spellbook and wand of fireballs
4. A bottle of dragon's blood with several effects, including turning its imbiber into a drake themselves.
When butchered, they leave behind diamonds, sinew, bone, and ash drake hide. Ash drake hide can be used to create a hooded cloak that protects its wearer from ash storms.
Difficulty: Medium
*/
/mob/living/simple_animal/hostile/megafauna/dragon
name = "ash drake"
desc = "Guardians of the necropolis."
@@ -1,3 +1,21 @@
/*
LEGION
Legion spawns from the necropolis gate in the far north of lavaland. It is the guardian of the Necropolis and emerges from within whenever an intruder tries to enter through its gate.
Whenever Legion emerges, everything in lavaland will receive a notice via color, audio, and text. This is because Legion is powerful enough to slaughter the entirety of lavaland with little effort.
It has two attack modes that it constantly rotates between.
In ranged mode, it will behave like a normal legion - retreating when possible and firing legion skulls at the target.
In charge mode, it will spin and rush its target, attacking with melee whenever possible.
When Legion dies, it drops a staff of storms, which allows its wielder to call and disperse ash storms at will and functions as a powerful melee weapon.
Difficulty: Medium
*/
/mob/living/simple_animal/hostile/megafauna/legion
name = "Legion"
health = 800
@@ -264,7 +264,7 @@
else
feedback_add_details("hivelord_core", "[type]|stabilizer")
/obj/item/organ/hivelord_core/proc/go_inert()
inert = TRUE
desc = "The remains of a hivelord that have become useless, having been left alone too long after being harvested."
@@ -454,7 +454,7 @@
mob_size = MOB_SIZE_LARGE
var/pre_attack = 0
var/pre_attack_icon = "Goliath_preattack"
loot = list(/obj/item/stack/sheet/animalhide/goliath_hide{layer = ABOVE_MOB_LAYER})
loot = list(/obj/item/stack/sheet/animalhide/goliath_hide)
/mob/living/simple_animal/hostile/asteroid/goliath/Life()
..()
@@ -486,7 +486,6 @@
ranged_cooldown = world.time + ranged_cooldown_time
icon_state = icon_aggro
pre_attack = 0
return
/mob/living/simple_animal/hostile/asteroid/goliath/adjustHealth(damage)
ranged_cooldown -= 10
@@ -498,7 +497,6 @@
handle_preattack()
if(icon_state != icon_aggro)
icon_state = icon_aggro
return
/obj/effect/goliath_tentacle/
name = "Goliath tentacle"
@@ -423,16 +423,25 @@
/mob/living/simple_animal/ex_act(severity, target)
..()
var/bomb_armor = getarmor(null, "bomb")
switch (severity)
if (1)
gib()
return
if(prob(bomb_armor))
adjustBruteLoss(500)
else
gib()
return
if (2)
adjustBruteLoss(60)
var/bloss = 60
if(prob(bomb_armor))
bloss = bloss / 1.5
adjustBruteLoss(bloss)
if(3)
adjustBruteLoss(30)
var/bloss = 30
if(prob(bomb_armor))
bloss = bloss / 1.5
adjustBruteLoss(bloss)
/mob/living/simple_animal/proc/CanAttack(atom/the_target)
if(see_invisible < the_target.invisibility)
+11
View File
@@ -201,6 +201,8 @@
if(href_list["votepollid"] && href_list["votetype"])
var/pollid = text2num(href_list["votepollid"])
var/votetype = href_list["votetype"]
//lets take data from the user to decide what kind of poll this is, without validating it
//what could go wrong
switch(votetype)
if(POLLTYPE_OPTION)
var/optionid = text2num(href_list["voteoptionid"])
@@ -219,6 +221,7 @@
var/id_max = text2num(href_list["maxid"])
if( (id_max - id_min) > 100 ) //Basic exploit prevention
//(protip, this stops no exploits)
usr << "The option ID difference is too big. Please contact administration or the database admin."
return
@@ -257,6 +260,14 @@
usr << "<span class='danger'>Maximum replies reached.</span>"
break
usr << "<span class='notice'>Vote successful.</span>"
if(POLLTYPE_IRV)
if (!href_list["IRVdata"])
src << "<span class='danger'>No ordering data found. Please try again or contact an administrator.</span>"
var/list/votelist = splittext(href_list["IRVdata"], ",")
if (!vote_on_irv_poll(pollid, votelist))
src << "<span class='danger'>Vote failed, please try again or contact an administrator.</span>"
return
src << "<span class='notice'>Vote successful.</span>"
/mob/new_player/proc/IsJobAvailable(rank)
var/datum/job/job = SSjob.GetJob(rank)
+276 -12
View File
@@ -24,7 +24,7 @@
/mob/new_player/proc/poll_player(pollid)
if(!pollid)
return
if(!dbcon.IsConnected())
if(!establish_db_connection())
usr << "<span class='danger'>Failed to establish database connection.</span>"
return
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM [format_table_name("poll_question")] WHERE id = [pollid]")
@@ -87,6 +87,7 @@
output += "<p><input type='submit' value='Vote'>"
output += "</form>"
output += "</div>"
src << browse(null ,"window=playerpolllist")
src << browse(output,"window=playerpoll;size=500x250")
if(POLLTYPE_TEXT)
var/DBQuery/voted_query = dbcon.NewQuery("SELECT replytext FROM [format_table_name("poll_textreply")] WHERE pollid = [pollid] AND ckey = '[ckey]'")
@@ -117,6 +118,7 @@
else
vote_text = replacetext(vote_text, "\n", "<br>")
output += "[vote_text]"
src << browse(null ,"window=playerpolllist")
src << browse(output,"window=playerpoll;size=500x500")
if(POLLTYPE_RATING)
var/DBQuery/voted_query = dbcon.NewQuery("SELECT o.text, v.rating FROM [format_table_name("poll_option")] o, [format_table_name("poll_vote")] v WHERE o.pollid = [pollid] AND v.ckey = '[ckey]' AND o.id = v.optionid")
@@ -172,6 +174,7 @@
output += "<input type='hidden' name='minid' value='[minid]'>"
output += "<input type='hidden' name='maxid' value='[maxid]'>"
output += "<p><input type='submit' value='Submit'></form>"
src << browse(null ,"window=playerpolllist")
src << browse(output,"window=playerpoll;size=500x500")
if(POLLTYPE_MULTI)
var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[ckey]'")
@@ -223,14 +226,133 @@
if(!votedfor.len)
output += "<p><input type='submit' value='Vote'></form>"
output += "</div>"
src << browse(null ,"window=playerpolllist")
src << browse(output,"window=playerpoll;size=500x250")
if(POLLTYPE_IRV)
var/datum/asset/irv_assets = get_asset_datum(/datum/asset/simple/IRV)
irv_assets.send(src)
var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[ckey]'")
if(!voted_query.Execute())
var/err = voted_query.ErrorMsg()
log_game("SQL ERROR obtaining optionid from poll_vote table. Error : \[[err]\]\n")
return
var/list/votedfor = list()
while(voted_query.NextRow())
votedfor.Add(text2num(voted_query.item[1]))
var/list/datum/polloption/options = list()
var/DBQuery/options_query = dbcon.NewQuery("SELECT id, text FROM [format_table_name("poll_option")] WHERE pollid = [pollid]")
if(!options_query.Execute())
var/err = options_query.ErrorMsg()
log_game("SQL ERROR obtaining id, text from poll_option table. Error : \[[err]\]\n")
return
while(options_query.NextRow())
var/datum/polloption/PO = new()
PO.optionid = text2num(options_query.item[1])
PO.optiontext = options_query.item[2]
options["[PO.optionid]"] += PO
//if they already voted, use their sort
if (votedfor.len)
var/list/datum/polloption/newoptions = list()
for (var/V in votedfor)
var/datum/polloption/PO = options["[V]"]
if(PO)
newoptions["[V]"] = PO
options -= "[V]"
//add any options that they didn't vote on (some how, some way)
options = shuffle(options)
for (var/V in options)
newoptions["[V]"] = options["[V]"]
options = newoptions
//otherwise, lets shuffle it.
else
var/list/datum/polloption/newoptions = list()
while (options.len)
var/list/local_options = options.Copy()
var/key
//the jist is we randomly remove all options from a copy of options until only one reminds,
// move that over to our new list
// and repeat until we've moved all of them
while (local_options.len)
key = local_options[rand(1, local_options.len)]
local_options -= key
var/value = options[key]
options -= key
newoptions[key] = value
options = newoptions
var/output = {"
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<script src="jquery-1.10.2.min.js"></script>
<script src="jquery-ui.custom-core-widgit-mouse-sortable-min.js"></script>
<style>
#sortable { list-style-type: none; margin: 0; padding: 2em; }
#sortable li { min-height: 1em; margin: 0px 1px 1px 1px; padding: 1px; border: 1px solid black; border-radius: 5px; background-color: white; cursor:move;}
#sortable .sortable-placeholder-highlight { min-height: 1em; margin: 0 2px 2px 2px; padding: 2px; border: 1px dotted blue; border-radius: 5px; background-color: GhostWhite; }
span.grippy { content: '....'; width: 10px; height: 20px; display: inline-block; overflow: hidden; line-height: 5px; padding: 3px 1px; cursor: move; vertical-align: middle; margin-top: -.7em; margin-right: .3em; font-size: 12px; font-family: sans-serif; letter-spacing: 2px; color: #cccccc; text-shadow: 1px 0 1px black; }
span.grippy::after { content: '.. .. .. ..';}
</style>
<script>
$(function() {
$( "#sortable" ).sortable({
placeholder: "sortable-placeholder-highlight",
axis: "y",
containment: "#ballot",
scroll: false,
cursor: "ns-resize",
tolerance: "pointer"
});
$( "#sortable" ).disableSelection();
$('form').submit(function(){
$('#IRVdata').val($( "#sortable" ).sortable("toArray", { attribute: "voteid" }));
});
});
</script>
</head>
<body>
<div align='center'><B>Player poll</B><hr>
<b>Question: [pollquestion]</b><br>Please sort the options in the order of <b>most preferred</b> to <b>least preferred</b><br>
<font size='2'>Revoting has been enabled on this poll, if you think you made a mistake, simply revote<br></font>
<font size='2'>Poll runs from <b>[pollstarttime]</b> until <b>[pollendtime]</b></font><p>
</div>
<form name='cardcomp' action='?src=\ref[src]' method='POST'>
<input type='hidden' name='src' value='\ref[src]'>
<input type='hidden' name='votepollid' value='[pollid]'>
<input type='hidden' name='votetype' value=[POLLTYPE_IRV]>
<input type='hidden' name='IRVdata' id='IRVdata'>
<div id="ballot" class="center">
<b><center>Most Preferred</center></b>
<ol id="sortable" class="rankings" style="padding:0px">
"}
for(var/O in options)
var/datum/polloption/PO = options["[O]"]
if(PO.optionid && PO.optiontext)
output += "<li voteid='[PO.optionid]' class='ranking'><span class='grippy'></span> [PO.optiontext]</li>\n"
output += {"
</ol>
<b><center>Least Preferred</center></b><br>
</div>
<p><input type='submit' value='[( votedfor.len ? "Re" : "")]Vote'></form>
"}
src << browse(null ,"window=playerpolllist")
src << browse(output,"window=playerpoll;size=500x500")
return
/mob/new_player/proc/poll_check_voted(pollid, table)
if(!dbcon.IsConnected())
/mob/new_player/proc/poll_check_voted(pollid, text = FALSE)
var/table = "poll_vote"
if (text)
table = "poll_textreply"
if (!establish_db_connection())
usr << "<span class='danger'>Failed to establish database connection.</span>"
return
var/DBQuery/query_hasvoted = dbcon.NewQuery("SELECT id FROM [format_table_name(table)] WHERE pollid = [pollid] AND ckey = '[ckey]'")
var/DBQuery/query_hasvoted = dbcon.NewQuery("SELECT id FROM `[format_table_name(table)]` WHERE pollid = [pollid] AND ckey = '[ckey]'")
if(!query_hasvoted.Execute())
var/err = query_hasvoted.ErrorMsg()
log_game("SQL ERROR obtaining id from [table] table. Error : \[[err]\]\n")
@@ -243,10 +365,134 @@
. = client.holder.rank
return .
/mob/new_player/proc/vote_rig_check()
if (usr != src)
if (!usr || !src)
return 0
//we gots ourselfs a dirty cheater on our hands!
log_game("[key_name(usr)] attempted to rig the vote by voting as [ckey]")
message_admins("[key_name_admin(usr)] attempted to rig the vote by voting as [ckey]")
usr << "<span class='danger'>You don't seem to be [ckey].</span>"
src << "<span class='danger'>Something went horribly wrong processing your vote. Please contact an administrator, they should have gotten a message about this</span>"
return 0
return 1
/mob/new_player/proc/vote_valid_check(pollid, holder, type)
if (!establish_db_connection())
src << "<span class='danger'>Failed to establish database connection.</span>"
return 0
pollid = text2num(pollid)
if (!pollid || pollid < 0)
return 0
//validate the poll is actually the right type of poll and its still active
var/DBQuery/select_query = dbcon.NewQuery({"
SELECT id
FROM [format_table_name("poll_question")]
WHERE
[(holder ? "" : "adminonly = false AND")]
id = [pollid]
AND
Now() BETWEEN starttime AND endtime
AND
polltype = '[type]'
"})
if (!select_query.Execute())
var/err = select_query.ErrorMsg()
log_game("SQL ERROR validating poll via poll_question table. Error : \[[err]\]\n")
return 0
if (!select_query.NextRow())
return 0
return 1
/mob/new_player/proc/vote_on_irv_poll(pollid, list/votelist)
if (!establish_db_connection())
src << "<span class='danger'>Failed to establish database connection.</span>"
return 0
if (!vote_rig_check())
return 0
pollid = text2num(pollid)
if (!pollid || pollid < 0)
return 0
if (!votelist || !istype(votelist) || !votelist.len)
return 0
if (!client)
return 0
//save these now so we can still process the vote if the client goes away while we process.
var/datum/admins/holder = client.holder
var/rank = "Player"
if (holder)
rank = holder.rank
var/ckey = client.ckey
var/address = client.address
//validate the poll
if (!vote_valid_check(pollid, holder, POLLTYPE_IRV))
return 0
//lets collect the options
var/DBQuery/options_query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_option")] WHERE pollid = [pollid]")
if (!options_query.Execute())
var/err = options_query.ErrorMsg()
log_game("SQL ERROR obtaining id from poll_option table. Error : \[[err]\]\n")
return 0
var/list/optionlist = list()
while (options_query.NextRow())
optionlist += text2num(options_query.item[1])
//validate their votes are actually in the list of options and actually numbers
var/list/numberedvotelist = list()
for (var/vote in votelist)
vote = text2num(vote)
numberedvotelist += vote
if (!vote) //this is fine because voteid starts at 1, so it will never be 0
src << "<span class='danger'>Error: Invalid (non-numeric) votes in the vote data.</span>"
return 0
if (!(vote in optionlist))
src << "<span class='danger'>Votes for choices that do not appear to be in the poll detected<span>"
return 0
if (!numberedvotelist.len)
src << "<span class='danger'>Invalid vote data</span>"
return 0
//lets add the vote, first we generate a insert statement.
var/sqlrowlist = ""
for (var/vote in numberedvotelist)
if (sqlrowlist != "")
sqlrowlist += ", " //a comma (,) at the start of the first row to insert will trigger a SQL error
sqlrowlist += "(Now(), [pollid], [vote], '[sanitizeSQL(ckey)]', '[sanitizeSQL(address)]', '[sanitizeSQL(rank)]')"
//now lets delete their old votes (if any)
var/DBQuery/voted_query = dbcon.NewQuery("DELETE FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[ckey]'")
if (!voted_query.Execute())
var/err = voted_query.ErrorMsg()
log_game("SQL ERROR clearing out old votes. Error : \[[err]\]\n")
return 0
//now to add the new ones.
var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO [format_table_name("poll_vote")] (datetime, pollid, optionid, ckey, ip, adminrank) VALUES [sqlrowlist]")
if(!query_insert.Execute())
var/err = query_insert.ErrorMsg()
log_game("SQL ERROR adding vote to table. Error : \[[err]\]\n")
src << "<span class='danger'>Error adding vote.</span>"
return 0
src << browse(null,"window=playerpoll")
return 1
/mob/new_player/proc/vote_on_poll(pollid, optionid)
if(!establish_db_connection())
src << "<span class='danger'>Failed to establish database connection.</span>"
return 0
if (!vote_rig_check())
return 0
if(!pollid || !optionid)
return
var/adminrank = poll_check_voted(pollid, "poll_vote")
//validate the poll
if (!vote_valid_check(pollid, client.holder, POLLTYPE_OPTION))
return 0
var/adminrank = poll_check_voted(pollid)
if(!adminrank)
return
var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO [format_table_name("poll_vote")] (datetime, pollid, optionid, ckey, ip, adminrank) VALUES (Now(), [pollid], [optionid], '[ckey]', '[client.address]', '[adminrank]')")
@@ -258,12 +504,20 @@
return 1
/mob/new_player/proc/log_text_poll_reply(pollid, replytext)
if(!establish_db_connection())
src << "<span class='danger'>Failed to establish database connection.</span>"
return 0
if (!vote_rig_check())
return 0
if(!pollid)
return
//validate the poll
if (!vote_valid_check(pollid, client.holder, POLLTYPE_TEXT))
return 0
if(!replytext)
usr << "The text you entered was blank. Please correct the text and submit again."
return
var/adminrank = poll_check_voted(pollid, "poll_textreply")
var/adminrank = poll_check_voted(pollid, TRUE)
if(!adminrank)
return
replytext = sanitizeSQL(replytext)
@@ -279,11 +533,16 @@
return 1
/mob/new_player/proc/vote_on_numval_poll(pollid, optionid, rating)
if(!establish_db_connection())
src << "<span class='danger'>Failed to establish database connection.</span>"
return 0
if (!vote_rig_check())
return 0
if(!pollid || !optionid || !rating)
return
if(!dbcon.IsConnected())
usr << "<span class='danger'>Failed to establish database connection.</span>"
return
//validate the poll
if (!vote_valid_check(pollid, client.holder, POLLTYPE_RATING))
return 0
var/DBQuery/query_hasvoted = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_vote")] WHERE optionid = [optionid] AND ckey = '[ckey]'")
if(!query_hasvoted.Execute())
var/err = query_hasvoted.ErrorMsg()
@@ -304,11 +563,16 @@
return 1
/mob/new_player/proc/vote_on_multi_poll(pollid, optionid)
if(!establish_db_connection())
src << "<span class='danger'>Failed to establish database connection.</span>"
return 0
if (!vote_rig_check())
return 0
if(!pollid || !optionid)
return 1
if(!dbcon.IsConnected())
usr << "<span class='danger'>Failed to establish database connection.</span>"
return 1
//validate the poll
if (!vote_valid_check(pollid, client.holder, POLLTYPE_MULTI))
return 0
var/DBQuery/query_get_choicelen = dbcon.NewQuery("SELECT multiplechoiceoptions FROM [format_table_name("poll_question")] WHERE id = [pollid]")
if(!query_get_choicelen.Execute())
var/err = query_get_choicelen.ErrorMsg()
+8 -2
View File
@@ -11,18 +11,24 @@
pressure_resistance = 8
burn_state = FLAMMABLE
var/amount = 30 //How much paper is in the bin.
var/list/papers = new/list() //List of papers put in the bin for reference.
var/list/papers = list() //List of papers put in the bin for reference.
/obj/item/weapon/paper_bin/fire_act()
if(!amount)
return
..()
/obj/item/weapon/paper_bin/Destroy()
if(papers)
for(var/i in papers)
qdel(i)
papers = null
. = ..()
/obj/item/weapon/paper_bin/burn()
amount = 0
extinguish()
update_icon()
return
/obj/item/weapon/paper_bin/MouseDrop(atom/over_object)
var/mob/living/M = usr
+6 -19
View File
@@ -114,7 +114,7 @@
setDir(SOUTH)
if(auto_name)
name = "[get_area(src)] APC"
name = "\improper [get_area(src)] APC"
pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 24 : -24)
pixel_y = (src.tdir & 3)? (src.tdir ==1 ? 24 : -24) : 0
@@ -147,7 +147,7 @@
qdel(cell)
if(terminal)
disconnect_terminal()
return ..()
. = ..()
/obj/machinery/power/apc/proc/make_terminal()
// create a terminal object at the same position as original turf loc
@@ -797,24 +797,11 @@
malf << "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process."
malf.malfhack = src
malf.malfhacking = TRUE
addtimer(src, "malfhacked", 600, FALSE, malf)
addtimer(malf, "malfhacked", 600, FALSE, src)
/obj/machinery/power/apc/proc/malfhacked(mob/living/silicon/ai/malf)
if(!istype(malf))
return
malf.malfhack = null
malf.malfhacking = FALSE
if(src && !src.aidisabled)
malf.malf_picker.processing_time += 10
malfai = malf.parent || malf
malfhack = TRUE
locked = TRUE
malf << "Hack complete. The APC is now under your exclusive control."
update_icon()
else
malf << "Hack aborted. The designated APC has stopped responding and no longer exists on the power network."
var/obj/screen/alert/hackingapc/A
A = malf.throw_alert("hackingapc", /obj/screen/alert/hackingapc)
A.target = src
/obj/machinery/power/apc/proc/malfoccupy(mob/living/silicon/ai/malf)
if(!istype(malf))
+18 -20
View File
@@ -48,7 +48,7 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
var/obj/singularity/energy_ball/EB = ball
qdel(EB)
return ..()
. = ..()
/obj/singularity/energy_ball/process()
if(!orbiting)
@@ -71,8 +71,6 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
else
energy = 0 // ensure we dont have miniballs of miniballs
return
/obj/singularity/energy_ball/examine(mob/user)
..()
if(orbiting_balls.len)
@@ -89,28 +87,17 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
var/turf/T = get_step(src, move_dir)
if(can_move(T))
loc = T
for(var/mob/living/carbon/C in loc)
dust_mobs(C)
/obj/singularity/energy_ball/proc/handle_energy()
if(energy >= energy_to_raise)
energy_to_lower = energy_to_raise - 20
energy_to_raise = energy_to_raise * 1.25
playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, 1, extrarange = 30)
spawn(100)
if (!loc)
return
var/obj/singularity/energy_ball/EB = new(loc)
EB.transform *= pick(0.3, 0.4, 0.5, 0.6, 0.7)
var/icon/I = icon(icon,icon_state,dir)
var/orbitsize = (I.Width() + I.Height()) * pick(0.4, 0.5, 0.6, 0.7, 0.8)
orbitsize -= (orbitsize / world.icon_size) * (world.icon_size * 0.25)
EB.orbit(src, orbitsize, pick(FALSE, TRUE), rand(10, 25), pick(3, 4, 5, 6, 36))
addtimer(src, "new_mini_ball", 100)
else if(energy < energy_to_lower && orbiting_balls.len)
energy_to_raise = energy_to_raise / 1.25
@@ -122,6 +109,20 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
else if(orbiting_balls.len)
dissipate() //sing code has a much better system.
/obj/singularity/energy_ball/proc/new_mini_ball()
if(!loc)
return
var/obj/singularity/energy_ball/EB = new(loc)
EB.transform *= pick(0.3, 0.4, 0.5, 0.6, 0.7)
var/icon/I = icon(icon,icon_state,dir)
var/orbitsize = (I.Width() + I.Height()) * pick(0.4, 0.5, 0.6, 0.7, 0.8)
orbitsize -= (orbitsize / world.icon_size) * (world.icon_size * 0.25)
EB.orbit(src, orbitsize, pick(FALSE, TRUE), rand(10, 25), pick(3, 4, 5, 6, 36))
/obj/singularity/energy_ball/Bump(atom/A)
dust_mobs(A)
@@ -146,7 +147,6 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
if(istype(A, /mob/living/carbon))
var/mob/living/carbon/C = A
C.dust()
return
/proc/tesla_zap(var/atom/source, zap_range = 3, power)
. = source.dir
@@ -262,5 +262,3 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
else if(closest_structure)
closest_structure.tesla_act(power)
+2 -2
View File
@@ -32,9 +32,8 @@
desc = "[initial(desc)][BB ? "" : " This one is spent"]"
/obj/item/ammo_casing/proc/newshot() //For energy weapons, shotgun shells and wands (!).
if (!BB)
if(!BB)
BB = new projectile_type(src)
return
/obj/item/ammo_casing/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/ammo_box))
@@ -79,6 +78,7 @@
var/multiload = 1
/obj/item/ammo_box/New()
..()
for(var/i = 1, i <= max_ammo, i++)
stored_ammo += new ammo_type(src)
update_icon()
-1
View File
@@ -107,7 +107,6 @@
/obj/item/weapon/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj)
user << "<span class='danger'>*click*</span>"
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
return
/obj/item/weapon/gun/proc/shoot_live_shot(mob/living/user as mob|obj, pointblank = 0, mob/pbtarget = null, message = 1)
@@ -36,7 +36,8 @@
if(istype(AM, mag_type))
if(magazine)
user << "<span class='notice'>You perform a tactical reload on \the [src], replacing the magazine.</span>"
magazine.loc = get_turf(src.loc)
magazine.dropped()
magazine.forceMove(get_turf(src.loc))
magazine.update_icon()
magazine = null
else
+56 -48
View File
@@ -35,7 +35,7 @@
var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here
var/nodamage = 0 //Determines if the projectile will skip any damage inflictions
var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb
var/projectile_type = "/obj/item/projectile"
var/projectile_type = /obj/item/projectile
var/range = 50 //This will de-increment every step. When 0, it will delete the projectile.
//Effects
var/stun = 0
@@ -140,58 +140,66 @@
Angle = setAngle
if(!legacy) //new projectiles
set waitfor = 0
var/next_run = world.time
while(loc)
if(!paused)
if((!( current ) || loc == current))
current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
if(paused)
next_run = world.time
sleep(1)
continue
if((!( current ) || loc == current))
current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
if(!Angle)
Angle=round(Get_Angle(src,current))
if(spread)
Angle += (rand() - 0.5) * spread
var/matrix/M = new
M.Turn(Angle)
transform = M
if(!Angle)
Angle=round(Get_Angle(src,current))
if(spread)
Angle += (rand() - 0.5) * spread
var/matrix/M = new
M.Turn(Angle)
transform = M
var/Pixel_x=round(sin(Angle)+16*sin(Angle)*2)
var/Pixel_y=round(cos(Angle)+16*cos(Angle)*2)
var/pixel_x_offset = pixel_x + Pixel_x
var/pixel_y_offset = pixel_y + Pixel_y
var/new_x = x
var/new_y = y
var/Pixel_x=round(sin(Angle)+16*sin(Angle)*2)
var/Pixel_y=round(cos(Angle)+16*cos(Angle)*2)
var/pixel_x_offset = pixel_x + Pixel_x
var/pixel_y_offset = pixel_y + Pixel_y
var/new_x = x
var/new_y = y
while(pixel_x_offset > 16)
pixel_x_offset -= 32
pixel_x -= 32
new_x++// x++
while(pixel_x_offset < -16)
pixel_x_offset += 32
pixel_x += 32
new_x--
while(pixel_x_offset > 16)
pixel_x_offset -= 32
pixel_x -= 32
new_x++// x++
while(pixel_x_offset < -16)
pixel_x_offset += 32
pixel_x += 32
new_x--
while(pixel_y_offset > 16)
pixel_y_offset -= 32
pixel_y -= 32
new_y++
while(pixel_y_offset < -16)
pixel_y_offset += 32
pixel_y += 32
new_y--
while(pixel_y_offset > 16)
pixel_y_offset -= 32
pixel_y -= 32
new_y++
while(pixel_y_offset < -16)
pixel_y_offset += 32
pixel_y += 32
new_y--
speed = round(speed)
step_towards(src, locate(new_x, new_y, z))
if(speed <= 1)
pixel_x = pixel_x_offset
pixel_y = pixel_y_offset
else
animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (speed <= 3 ? speed - 1 : speed)))
step_towards(src, locate(new_x, new_y, z))
next_run += max(world.tick_lag, speed)
var/delay = next_run - world.time
if(delay <= world.tick_lag*2)
pixel_x = pixel_x_offset
pixel_y = pixel_y_offset
else
animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (delay <= 3 ? delay - 1 : delay)))
if(original && (original.layer>=2.75) || ismob(original))
if(loc == get_turf(original))
if(!(original in permutated))
Bump(original, 1)
Range()
sleep(max(1, speed))
if(original && (original.layer>=2.75) || ismob(original))
if(loc == get_turf(original))
if(!(original in permutated))
Bump(original, 1)
Range()
if (delay > 0)
sleep(delay)
else //old projectile system
set waitfor = 0
while(loc)
@@ -204,7 +212,7 @@
if(!(original in permutated))
Bump(original, 1)
Range()
sleep(1)
sleep(config.run_speed * 0.9)
/obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it.
@@ -218,4 +226,4 @@
/obj/item/projectile/proc/dumbfire(var/dir)
current = get_ranged_target_turf(src, dir, world.maxx)
fire()
fire()
@@ -125,7 +125,6 @@
G.temperature = max(min(G.temperature-(CT*1000),G.temperature/CT),0)
G.react()
qdel(hotspot)
return
/*
* Water reaction to an object
@@ -589,7 +589,10 @@
metabolization_rate = 0.5 * REAGENTS_METABOLISM
/datum/reagent/toxin/amanitin/on_mob_delete(mob/living/M)
M.adjustToxLoss(current_cycle*3*REM)
var/toxdamage = current_cycle*3*REM
M.adjustToxLoss(toxdamage)
if(M)
add_logs(M, get_turf(M), "has taken [toxdamage] toxin damage from amanitin toxin")
..()
/datum/reagent/toxin/lipolicide
@@ -258,9 +258,8 @@
if(istype(T, /turf/open/floor)) //intact floor, pop the tile
var/turf/open/floor/myturf = T
if(myturf.builtin_tile)
myturf.builtin_tile.loc = T
myturf.builtin_tile = null
if(myturf.floor_tile)
PoolOrNew(myturf.floor_tile, T)
myturf.make_plating()
if(direction) // direction is specified
@@ -711,3 +711,20 @@
materials = list(MAT_METAL = 12000)
build_path = /obj/item/wallframe/turret_control
category = list("initial", "Construction")
/datum/design/conveyor_belt
name = "Conveyor belt"
id = "conveyor_belt"
build_type = AUTOLATHE
materials = list(MAT_METAL = 5000)
build_path = /obj/item/conveyor_construct
category = list("initial", "Construction")
/datum/design/conveyor_switch
name = "Conveyor belt switch"
id = "conveyor_switch"
build_type = AUTOLATHE
materials = list(MAT_METAL = 450, MAT_GLASS = 190)
build_path = /obj/item/conveyor_switch_construct
category = list("initial", "Construction")
-6
View File
@@ -1,11 +1,5 @@
//If you're looking for spawners like ash walker eggs, check ghost_role_spawners.dm
/obj/machinery/lavaland_controller
name = "weather machine"
desc = "Controls the weather... when it's on, at any rate. A sticky note on the side proclaims \"DISABLED IN FAVOR OF AN ACTUAL ATMOSPHERE\"."
icon = 'icons/obj/machines/telecomms.dmi'
icon_state = "processor_off"
/obj/structure/fans/tiny/invisible //For blocking air in ruin doorways
invisibility = INVISIBILITY_ABSTRACT
@@ -1,5 +1,5 @@
//The necropolis gate is used to call forth Legion from the Necropolis.
/obj/structure/lavaland_door
/obj/structure/necropolis_gate
name = "necropolis gate"
desc = "A tremendous and impossibly large gateway, bored into dense bedrock."
icon = 'icons/effects/96x96.dmi'
@@ -9,12 +9,13 @@
opacity = 1
bound_width = 96
bound_height = 96
pixel_x = -32
burn_state = LAVA_PROOF
luminosity = 1
var/boss = FALSE
var/is_anyone_home = FALSE
/obj/structure/lavaland_door/attack_hand(mob/user)
/obj/structure/necropolis_gate/attack_hand(mob/user)
for(var/mob/living/simple_animal/hostile/megafauna/legion/L in mob_list)
return
if(is_anyone_home)
@@ -51,10 +52,10 @@
is_anyone_home = FALSE
new/mob/living/simple_animal/hostile/megafauna/legion(get_step(src.loc, SOUTH))
/obj/structure/lavaland_door/singularity_pull()
/obj/structure/necropolis_gate/singularity_pull()
return 0
/obj/structure/lavaland_door/Destroy(force)
/obj/structure/necropolis_gate/Destroy(force)
if(force)
. = ..()
else
+3
View File
@@ -435,6 +435,8 @@
if(S0.area_type)
area_type = S0.area_type
var/destination_turf_type = S1.turf_type
var/list/L0 = return_ordered_turfs(x, y, z, dir, areaInstance)
var/list/L1 = return_ordered_turfs(S1.x, S1.y, S1.z, S1.dir)
@@ -466,6 +468,7 @@
continue
if(T0.type != T0.baseturf) //So if there is a hole in the shuttle we don't drag along the space/asteroid/etc to wherever we are going next
T0.copyTurf(T1)
T1.baseturf = destination_turf_type
areaInstance.contents += T1
//copy over air
+2 -2
View File
@@ -53,7 +53,7 @@
*
* return datum/tgui The requested UI.
**/
/datum/tgui/New(mob/user, datum/src_object, ui_key, interface, title, width = 0, height = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state, browser_id)
/datum/tgui/New(mob/user, datum/src_object, ui_key, interface, title, width = 0, height = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state, browser_id = null)
src.user = user
src.src_object = src_object
src.ui_key = ui_key
@@ -99,7 +99,7 @@
var/debugable = check_rights_for(user.client, R_DEBUG)
user << browse(get_html(debugable), "window=[window_id];[window_size][list2params(window_options)]") // Open the window.
if (custom_browser_id)
if (!custom_browser_id)
winset(user, window_id, "on-close=\"uiclose \ref[src]\"") // Instruct the client to signal UI when the window is closed.
SStgui.on_open(src)
+1
View File
@@ -11,6 +11,7 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG
/world/New()
check_for_cleanbot_bug()
map_ready = 1
world.log << "Map is ready."
#if (PRELOAD_RSC == 0)
external_rsc_urls = file2list("config/external_rsc_urls.txt","\n")

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