mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-21 04:57:57 +01:00
Merge branch 'master' into turn-both-keys
Conflicts: tgui/assets/tgui.js
This commit is contained in:
@@ -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" = (
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
+1454
-1465
File diff suppressed because it is too large
Load Diff
@@ -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}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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 hageh’guf 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")
|
||||
|
||||
@@ -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("Ohv’yqva...", "...n qvfcra’fre!")
|
||||
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("Thne’qvnaf...", "...bs gur Ratvar...", "...qrs’raq!")
|
||||
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 guv’f 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 guv’f 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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
. = ""
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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...")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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!"
|
||||
|
||||
@@ -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)]"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user