Bleeding edgy refresh (#303)

* not code stuff

* other things

* global vars, defines, helpers

* onclick hud stuff, orphans, world.dm

* controllers and datums

* game folder

* everything not client/mobs in modules

* client folder

* stage 1 mob stuff

* simple animal things

* silicons

* carbon things

* ayylmaos and monkeys

* hyoomahn

* icons n shit

* sprite fixes

* compile fixes

* some fixes I cherrypicked.

* qdel fixes

* forgot brain refractors
This commit is contained in:
Poojawa
2017-03-21 11:44:10 -05:00
committed by GitHub
parent 099a6c8764
commit f67e9f6d87
1476 changed files with 344416 additions and 40694 deletions
+11 -19
View File
@@ -37,7 +37,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
icon_state = "space"
requires_power = 1
always_unpowered = 1
lighting_use_dynamic = DYNAMIC_LIGHTING_DISABLED
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
power_light = 0
power_equip = 0
power_environ = 0
@@ -48,14 +48,13 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/space/nearstation
icon_state = "space_near"
lighting_use_dynamic = DYNAMIC_LIGHTING_IFSTARLIGHT
dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT
/area/start
name = "start area"
icon_state = "start"
requires_power = 0
luminosity = 1
lighting_use_dynamic = DYNAMIC_LIGHTING_DISABLED
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
has_gravity = 1
@@ -81,7 +80,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/asteroid/artifactroom/New()
..()
SetDynamicLighting()
set_dynamic_lighting()
/area/planet/clown
name = "Clown Planet"
@@ -108,10 +107,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
'sound/ambience/ambimaint3.ogg',
'sound/ambience/ambimaint4.ogg',
'sound/ambience/ambimaint5.ogg',
'sound/ambience/ambimaint6.ogg',
'sound/ambience/ambimaint7.ogg',
'sound/ambience/ambimaint8.ogg',
'sound/ambience/ambimaint9.ogg',
'sound/voice/lowHiss2.ogg', //Xeno Breathing Hisses, Hahahaha I'm not even sorry.
'sound/voice/lowHiss3.ogg',
'sound/voice/lowHiss4.ogg')
@@ -422,8 +417,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/solar
requires_power = 0
luminosity = 1
lighting_use_dynamic = DYNAMIC_LIGHTING_IFSTARLIGHT
dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT
valid_territory = 0
blob_allowed = FALSE
flags = NONE
@@ -927,26 +921,18 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/ai_monitored/turret_protected/AIsatextFP
name = "AI Sat Ext"
icon_state = "storage"
luminosity = 1
lighting_use_dynamic = DYNAMIC_LIGHTING_IFSTARLIGHT
/area/ai_monitored/turret_protected/AIsatextFS
name = "AI Sat Ext"
icon_state = "storage"
luminosity = 1
lighting_use_dynamic = DYNAMIC_LIGHTING_IFSTARLIGHT
/area/ai_monitored/turret_protected/AIsatextAS
name = "AI Sat Ext"
icon_state = "storage"
luminosity = 1
lighting_use_dynamic = DYNAMIC_LIGHTING_IFSTARLIGHT
/area/ai_monitored/turret_protected/AIsatextAP
name = "AI Sat Ext"
icon_state = "storage"
luminosity = 1
lighting_use_dynamic = DYNAMIC_LIGHTING_IFSTARLIGHT
/area/ai_monitored/turret_protected/NewAIMain
name = "AI Main New"
@@ -999,7 +985,13 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Telecommunications Satellite Lounge"
icon_state = "tcomsatlounge"
/area/chapel/asteroid
name = "Chapel Asteroid"
icon_state = "explored"
/area/chapel/dock
name = "Chapel Dock"
icon_state = "construction"
/////////////////////////////////////////////////////////////////////
/*
+19 -13
View File
@@ -111,8 +111,11 @@ var/list/teleportlocs = list()
power_equip = 1
power_environ = 1
if (lighting_use_dynamic != DYNAMIC_LIGHTING_IFSTARLIGHT)
lighting_use_dynamic = DYNAMIC_LIGHTING_DISABLED
if(dynamic_lighting == DYNAMIC_LIGHTING_FORCED)
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
luminosity = 0
else if(dynamic_lighting != DYNAMIC_LIGHTING_IFSTARLIGHT)
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
..()
@@ -120,6 +123,9 @@ var/list/teleportlocs = list()
blend_mode = BLEND_MULTIPLY // Putting this in the constructor so that it stops the icons being screwed up in the map editor.
if(!IS_DYNAMIC_LIGHTING(src))
add_overlay(/obj/effect/fullbright)
/area/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
@@ -255,6 +261,12 @@ var/list/teleportlocs = list()
for(var/area/RA in related)
RA.ModifyFiredoors(FALSE)
/area/proc/close_and_lock_door(obj/machinery/door/DOOR)
set waitfor = FALSE
DOOR.close()
if(DOOR.density)
DOOR.lock()
/area/proc/burglaralert(obj/trigger)
if(always_unpowered == 1) //no burglar alarms in space/asteroid
return
@@ -266,10 +278,7 @@ var/list/teleportlocs = list()
RA.set_fire_alarm_effect()
//Lockdown airlocks
for(var/obj/machinery/door/DOOR in RA)
spawn(0)
DOOR.close()
if(DOOR.density)
DOOR.lock()
close_and_lock_door(DOOR)
for (var/obj/machinery/camera/C in RA)
cameras += C
@@ -325,15 +334,11 @@ var/list/teleportlocs = list()
icon_state = "party"
else
icon_state = "blue-red"
invisibility = INVISIBILITY_LIGHTING
else
// new lighting behaviour with obj lights
icon_state = null
invisibility = INVISIBILITY_MAXIMUM
/area/space/updateicon()
icon_state = null
invisibility = INVISIBILITY_MAXIMUM
/*
#define EQUIP 1
@@ -413,6 +418,7 @@ var/list/teleportlocs = list()
/area/Entered(A)
set waitfor = FALSE
if(!isliving(A))
return
@@ -434,9 +440,9 @@ var/list/teleportlocs = list()
if(!L.client.played)
L << sound(sound, repeat = 0, wait = 0, volume = 25, channel = 1)
L.client.played = 1
spawn(600) //ewww - this is very very bad
if(L.&& L.client)
L.client.played = 0
sleep(600) //ewww - this is very very bad
if(L.&& L.client)
L.client.played = 0
/atom/proc/has_gravity(turf/T)
if(!T || !isturf(T))
+7 -21
View File
@@ -21,16 +21,14 @@
/area/awaymission/beach
name = "Beach"
icon_state = "away"
luminosity = 1
lighting_use_dynamic = DYNAMIC_LIGHTING_DISABLED
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
requires_power = 0
has_gravity = 1
ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg')
/area/awaymission/errorroom
name = "Super Secret Room"
luminosity = 1
lighting_use_dynamic = DYNAMIC_LIGHTING_DISABLED
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
has_gravity = 1
@@ -39,8 +37,7 @@
/area/awaymission/research
name = "Research Outpost"
icon_state = "away"
luminosity = 0
lighting_use_dynamic = DYNAMIC_LIGHTING_ENABLED
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
/area/awaymission/research/interior
name = "Research Inside"
@@ -159,15 +156,13 @@
name = "Snow Forest"
icon_state = "away"
requires_power = 0
luminosity = 1
lighting_use_dynamic = DYNAMIC_LIGHTING_ENABLED
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
/area/awaymission/cabin
name = "Cabin"
icon_state = "away2"
requires_power = 1
luminosity = 0
lighting_use_dynamic = DYNAMIC_LIGHTING_ENABLED
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
/area/awaymission/snowforest/lumbermill
name = "Lumbermill"
@@ -178,7 +173,6 @@
/area/awaymission/BMPship
name = "BMP Asteroids"
icon_state = "away"
luminosity = 0
/area/awaymission/BMPship/Aft
@@ -234,31 +228,26 @@
/area/awaymission/wwmines
name = "Wild West Mines"
icon_state = "away1"
luminosity = 1
requires_power = 0
/area/awaymission/wwgov
name = "Wild West Mansion"
icon_state = "away2"
luminosity = 1
requires_power = 0
/area/awaymission/wwrefine
name = "Wild West Refinery"
icon_state = "away3"
luminosity = 1
requires_power = 0
/area/awaymission/wwvault
name = "Wild West Vault"
icon_state = "away3"
luminosity = 0
/area/awaymission/wwvaultdoors
name = "Wild West Vault Doors" // this is to keep the vault area being entirely lit because of requires_power
icon_state = "away2"
requires_power = 0
luminosity = 0
/*
@@ -327,8 +316,7 @@
name = "Snowdin Tundra Plains"
icon_state = "away"
requires_power = 0
luminosity = 1
lighting_use_dynamic = DYNAMIC_LIGHTING_ENABLED
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
/area/awaymission/snowdin/post
name = "Snowdin Outpost"
@@ -341,7 +329,6 @@
/area/awaymission/snowdin/cave
name = "Snowdin Caves"
icon_state = "away2"
luminosity = 0
/area/awaymission/snowdin/base
name = "Snowdin Main Base"
@@ -351,7 +338,6 @@
/area/awaymission/snowdin/dungeon1
name = "Snowdin Depths"
icon_state = "away2"
luminosity = 0
/area/awaymission/snowdin/sekret
name = "Snowdin Operations"
@@ -454,4 +440,4 @@
icon_state = "awaycontent29"
/area/awaycontent/a30
icon_state = "awaycontent30"
icon_state = "awaycontent30"
+6
View File
@@ -4,6 +4,7 @@
/area/centcom
name = "Centcom"
icon_state = "centcom"
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
requires_power = 0
has_gravity = 1
noteleport = 1
@@ -33,16 +34,19 @@
/area/tdome
name = "Thunderdome"
icon_state = "yellow"
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
requires_power = 0
has_gravity = 1
/area/tdome/arena
name = "Thunderdome Arena"
icon_state = "thunder"
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
/area/tdome/arena_source
name = "Thunderdome Arena Template"
icon_state = "thunder"
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
/area/tdome/tdome1
name = "Thunderdome (Team 1)"
@@ -67,6 +71,7 @@
/area/wizard_station
name = "Wizard's Den"
icon_state = "yellow"
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
requires_power = 0
has_gravity = 1
noteleport = 1
@@ -91,6 +96,7 @@
/area/syndicate_mothership/control
name = "Syndicate Control Room"
icon_state = "syndie-control"
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
/area/syndicate_mothership/elite_squad
name = "Syndicate Elite Squad"
+1 -3
View File
@@ -1,8 +1,7 @@
/area/holodeck
name = "Holodeck"
icon_state = "Holodeck"
luminosity = 1
lighting_use_dynamic = 0
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
flags = 0
var/obj/machinery/computer/holodeck/linked
@@ -125,4 +124,3 @@
/area/holodeck/rec_center/thunderdome1218
name = "Holodeck - 1218 AD"
restricted = 1
+1 -1
View File
@@ -113,7 +113,7 @@
icon_state = "space"
requires_power = 1
always_unpowered = 1
lighting_use_dynamic = DYNAMIC_LIGHTING_DISABLED
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
has_gravity = 0
power_light = 0
power_equip = 0
+1 -2
View File
@@ -4,8 +4,7 @@
/area/shuttle
name = "Shuttle"
requires_power = 0
luminosity = 1
lighting_use_dynamic = DYNAMIC_LIGHTING_ENABLED
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
has_gravity = 1
always_unpowered = 0
valid_territory = 0
-198
View File
@@ -1,198 +0,0 @@
var/global/list/possiblethemes = list("organharvest","cult","wizden","cavein","xenoden","hitech","speakeasy","plantlab")
var/global/max_secret_rooms = 6
/proc/spawn_room(atom/start_loc, x_size, y_size, list/walltypes, floor, name, oldarea)
var/list/room_turfs = list("walls"=list(),"floors"=list())
var/area/asteroid/artifactroom/A = new
if(name)
A.name = name
else
A.name = "Artifact Room #[start_loc.x]-[start_loc.y]-[start_loc.z]"
for(var/x = 0, x < x_size, x++) //sets the size of the room on the x axis
for(var/y = 0, y < y_size, y++) //sets it on y axis.
var/turf/T
var/cur_loc = locate(start_loc.x + x, start_loc.y + y, start_loc.z)
if(x == 0 || x == x_size-1 || y == 0 || y == y_size-1)
var/wall = pickweight(walltypes)//totally-solid walls are pretty boring.
T = cur_loc
T.ChangeTurf(wall)
room_turfs["walls"] += T
else
T = cur_loc
T.ChangeTurf(floor)
room_turfs["floors"] += T
if(!oldarea)
A.contents += T
return room_turfs
//////////////
/proc/make_mining_asteroid_secrets()
for(var/i in 1 to max_secret_rooms)
make_mining_asteroid_secret()
/proc/make_mining_asteroid_secret()
var/valid = 0
var/turf/T = null
var/sanity = 0
var/list/room = null
var/list/turfs = null
var/x_size = 5
var/y_size = 5
var/areapoints = 0
var/theme = "organharvest"
var/list/walltypes = list(/turf/closed/wall=3, /turf/closed/mineral/random=1)
var/list/floortypes = list(/turf/open/floor/plasteel)
var/list/treasureitems = list()//good stuff. only 1 is created per room.
var/list/fluffitems = list()//lesser items, to help fill out the room and enhance the theme.
x_size = rand(3,7)
y_size = rand(3,7)
areapoints = x_size * y_size
switch(pick(possiblethemes))//what kind of room is this gonna be?
if("organharvest")
walltypes = list(/turf/closed/wall/r_wall=2,/turf/closed/wall=2,/turf/closed/mineral/random/high_chance=1)
floortypes = list(/turf/open/floor/plasteel,/turf/open/floor/engine)
treasureitems = list(/mob/living/simple_animal/bot/medbot/mysterious=1, /obj/item/weapon/circular_saw=1, /obj/structure/closet/crate/critter=2, /mob/living/simple_animal/pet/cat/space=1)
fluffitems = list(/obj/effect/decal/cleanable/blood=5,/obj/item/organ/appendix=2,/obj/structure/closet/crate/freezer=2,
/obj/structure/table/optable=1,/obj/item/weapon/scalpel=1,/obj/item/weapon/storage/firstaid/regular=3,
/obj/item/weapon/tank/internals/anesthetic=1, /obj/item/weapon/surgical_drapes=2, /obj/item/device/mass_spectrometer/adv=1,/obj/item/clothing/glasses/hud/health=1)
if("cult")
theme = "cult"
walltypes = list(/turf/closed/wall/mineral/cult=3,/turf/closed/mineral/random/high_chance=1)
floortypes = list(/turf/open/floor/plasteel/cult)
treasureitems = list(/obj/item/device/soulstone/anybody=1, /obj/item/clothing/suit/space/hardsuit/cult=1, /obj/item/weapon/bedsheet/cult=2,
/obj/item/clothing/suit/cultrobes=2, /mob/living/simple_animal/hostile/creature=3)
fluffitems = list(/obj/effect/gateway=1,/obj/effect/gibspawner=1,/obj/structure/destructible/cult/talisman=1,/obj/item/toy/crayon/red=2,
/obj/item/organ/heart=2, /obj/effect/decal/cleanable/blood=4,/obj/structure/table/wood=2,/obj/item/weapon/ectoplasm=3,
/obj/item/clothing/shoes/cult=1)
if("wizden")
theme = "wizden"
walltypes = list(/turf/closed/wall/mineral/plasma=3,/turf/closed/mineral/random/high_chance=1)
floortypes = list(/turf/open/floor/wood)
treasureitems = list(/obj/item/weapon/veilrender/vealrender=2, /obj/item/weapon/spellbook/oneuse/blind=1,/obj/item/clothing/head/wizard/red=2,
/obj/item/weapon/spellbook/oneuse/forcewall=1, /obj/item/weapon/spellbook/oneuse/smoke=1, /obj/structure/constructshell = 1, /obj/item/toy/katana=3,/obj/item/voodoo=3)
fluffitems = list(/obj/structure/safe/floor=1,/obj/structure/dresser=1,/obj/item/weapon/storage/belt/soulstone=1,/obj/item/trash/candle=3,
/obj/item/weapon/dice=3,/obj/item/weapon/staff=2,/obj/effect/decal/cleanable/dirt=3,/obj/item/weapon/coin/mythril=3)
if("cavein")
theme = "cavein"
walltypes = list(/turf/closed/mineral/random/high_chance=1)
floortypes = list(/turf/open/floor/plating/asteroid/basalt, /turf/open/floor/plating/beach/sand)
treasureitems = list(/obj/mecha/working/ripley/mining=1, /obj/item/weapon/pickaxe/drill/diamonddrill=2,
/obj/item/weapon/resonator/upgraded=1, /obj/item/weapon/pickaxe/drill/jackhammer=5)
fluffitems = list(/obj/effect/decal/cleanable/blood=3,/obj/effect/decal/remains/human=1,/obj/item/clothing/under/overalls=1,
/obj/item/weapon/reagent_containers/food/snacks/grown/chili=1,/obj/item/weapon/tank/internals/oxygen/red=2)
if("xenoden")
theme = "xenoden"
walltypes = list(/turf/closed/mineral/random/high_chance=1)
floortypes = list(/turf/open/floor/plating/asteroid/basalt, /turf/open/floor/plating/beach/sand)
treasureitems = list(/obj/item/clothing/mask/facehugger=1)
fluffitems = list(/obj/effect/decal/remains/human=1,/obj/effect/decal/cleanable/xenoblood/xsplatter=5)
if("hitech")
theme = "hitech"
walltypes = list(/turf/closed/wall/r_wall=5,/turf/closed/mineral/random=1)
floortypes = list(/turf/open/floor/greengrid,/turf/open/floor/bluegrid)
treasureitems = list(/obj/item/weapon/stock_parts/cell/hyper=1, /obj/machinery/chem_dispenser/constructable=1,/obj/machinery/computer/telescience=1, /obj/machinery/r_n_d/protolathe=1,
/obj/machinery/biogenerator=1)
fluffitems = list(/obj/structure/table/reinforced=2,/obj/item/weapon/stock_parts/scanning_module/phasic=3,
/obj/item/weapon/stock_parts/matter_bin/super=3,/obj/item/weapon/stock_parts/manipulator/pico=3,
/obj/item/weapon/stock_parts/capacitor/super=3,/obj/item/device/pda/clear=1, /obj/structure/mecha_wreckage/phazon=1)
if("speakeasy")
theme = "speakeasy"
floortypes = list(/turf/open/floor/plasteel,/turf/open/floor/wood)
treasureitems = list(/obj/item/weapon/melee/energy/sword/pirate=1,/obj/item/weapon/gun/ballistic/revolver/doublebarrel=1,/obj/item/weapon/storage/backpack/satchel/flat=1,
/obj/machinery/reagentgrinder=2, /obj/machinery/computer/security/wooden_tv=4, /obj/machinery/vending/coffee=3)
fluffitems = list(/obj/structure/table/wood=2,/obj/structure/reagent_dispensers/beerkeg=1,/obj/item/stack/spacecash/c500=4,
/obj/item/weapon/reagent_containers/food/drinks/shaker=1,/obj/item/weapon/reagent_containers/food/drinks/bottle/wine=3,
/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey=3,/obj/item/clothing/shoes/laceup=2)
if("plantlab")
theme = "plantlab"
treasureitems = list(/obj/item/weapon/gun/energy/floragun=1,/obj/item/seeds/sunflower/novaflower=2,/obj/item/seeds/tomato/blue/bluespace=2,/obj/item/seeds/tomato/blue=2,
/obj/item/seeds/coffee/robusta=2, /obj/item/seeds/firelemon=2)
fluffitems = list(/obj/item/weapon/twohanded/required/kirbyplants=1,/obj/structure/table/reinforced=2,/obj/machinery/hydroponics/constructable=1,
/obj/structure/glowshroom/single=2,/obj/item/weapon/reagent_containers/syringe/charcoal=2,
/obj/item/weapon/reagent_containers/glass/bottle/diethylamine=3,/obj/item/weapon/reagent_containers/glass/bottle/ammonia=3)
/*if("poly")
theme = "poly"
x_size = 5
y_size = 5
walltypes = list(/turf/closed/wall/mineral/clown)
floortypes= list(/turf/open/floor/engine)
treasureitems = list(/obj/item/weapon/spellbook=1,/obj/mecha/combat/marauder=1,/obj/machinery/wish_granter=1)
fluffitems = list(/obj/item/weapon/melee/energy/axe)*/
possiblethemes -= theme //once a theme is selected, it's out of the running!
var/floor = pick(floortypes)
turfs = get_area_turfs(/area/lavaland/surface/outdoors)
if(!turfs.len)
return 0
while(!valid)//Finds some spots to place these rooms at, where they won't be spotted immediately.
valid = 1
sanity++
if(sanity > 100)
return 0
T=pick(turfs)
if(!T)
return 0
var/list/surroundings = list()
surroundings += range(7, locate(T.x,T.y,T.z))
surroundings += range(7, locate(T.x+x_size,T.y,T.z))
surroundings += range(7, locate(T.x,T.y+y_size,T.z))
surroundings += range(7, locate(T.x+x_size,T.y+y_size,T.z))
for(var/turf/check in surroundings)
var/area/new_area = get_area(check)
if(!(istype(new_area, /area/lavaland/surface/outdoors)))
valid = FALSE
break
if(!T)
return 0
room = spawn_room(T,x_size,y_size,walltypes,floor) //WE'RE FINALLY CREATING THE ROOM
if(room)//time to fill it with stuff
var/list/emptyturfs = room["floors"]
T = pick(emptyturfs)
if(T)
new /obj/structure/glowshroom/single(T) //Just to make it a little more visible
var/surprise = null
surprise = pickweight(treasureitems)
new surprise(T)//here's the prize
emptyturfs -= T
while(areapoints >= 10)//lets throw in the fluff items
T = pick(emptyturfs)
var/garbage = null
garbage = pickweight(fluffitems)
new garbage(T)
areapoints -= 5
emptyturfs -= T
//world.log << "The [theme] themed [T.loc] has been created!"
return 1
+37 -34
View File
@@ -2,7 +2,10 @@
layer = TURF_LAYER
plane = GAME_PLANE
var/level = 2
var/flags = 0
var/list/secondary_flags
var/list/fingerprints
var/list/fingerprintshidden
var/list/blood_DNA
@@ -29,22 +32,15 @@
//atom creation method that preloads variables at creation
if(use_preloader && (src.type == _preloader.target_path))//in case the instanciated atom is creating other atoms in New()
_preloader.load(src)
//atom color stuff
if(color)
add_atom_colour(color, FIXED_COLOUR_PRIORITY)
//lighting stuff
if(opacity && isturf(src.loc))
src.loc.UpdateAffectingLights()
if(luminosity)
light = new(src)
//. = ..() //uncomment if you are dumb enough to add a /datum/New() proc
var/do_initialize = SSatoms.initialized
if(do_initialize > INITIALIZATION_INSSATOMS)
if(QDELETED(src))
CRASH("Found new qdeletion in type [type]!")
args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD
Initialize(arglist(args))
//. = ..() //uncomment if you are dumb enough to add a /datum/New() proc
//Called after New if the map is being loaded. mapload = TRUE
//Called from base of New if the map is being loaded. mapload = FALSE
@@ -57,11 +53,26 @@
//Note: the following functions don't call the base for optimization and must copypasta:
// /turf/Initialize
// /turf/open/space/Initialize
// /mob/dead/new_player/Initialize
//Do also note that this proc always runs in New for /mob/dead
/atom/proc/Initialize(mapload, ...)
if(initialized)
stack_trace("Warning: [src]([type]) initialized multiple times!")
initialized = TRUE
//atom color stuff
if(color)
add_atom_colour(color, FIXED_COLOUR_PRIORITY)
if (light_power && light_range)
update_light()
if (opacity && isturf(loc))
var/turf/T = loc
T.has_opaque_atom = TRUE // No need to recalculate it in this case, it's guaranteed to be on afterwards anyways.
/atom/Destroy()
if(alternate_appearances)
for(var/aakey in alternate_appearances)
@@ -165,16 +176,6 @@
/atom/proc/is_transparent()
return container_type & TRANSPARENT
/*//Convenience proc to see whether a container can be accessed in a certain way.
/atom/proc/can_subract_container()
return flags & EXTRACT_CONTAINER
/atom/proc/can_add_container()
return flags & INSERT_CONTAINER
*/
/atom/proc/allow_drop()
return 1
@@ -185,7 +186,7 @@
return
/atom/proc/emp_act(severity)
if(istype(wires))
if(istype(wires) && !HAS_SECONDARY_FLAG(src, NO_EMP_WIRES))
wires.emp_pulse()
/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
@@ -234,26 +235,26 @@
f_name = "a "
f_name += "<span class='danger'>blood-stained</span> [name]!"
user << "\icon[src] That's [f_name]"
to_chat(user, "\icon[src] That's [f_name]")
if(desc)
user << desc
to_chat(user, desc)
// *****RM
//user << "[name]: Dn:[density] dir:[dir] cont:[contents] icon:[icon] is:[icon_state] loc:[loc]"
//to_chat(user, "[name]: Dn:[density] dir:[dir] cont:[contents] icon:[icon] is:[icon_state] loc:[loc]")
if(reagents && (is_open_container() || is_transparent())) //is_open_container() isn't really the right proc for this, but w/e
user << "It contains:"
to_chat(user, "It contains:")
if(reagents.reagent_list.len)
if(user.can_see_reagents()) //Show each individual reagent
for(var/datum/reagent/R in reagents.reagent_list)
user << "[R.volume] units of [R.name]"
to_chat(user, "[R.volume] units of [R.name]")
else //Otherwise, just show the total volume
var/total_volume = 0
for(var/datum/reagent/R in reagents.reagent_list)
total_volume += R.volume
user << "[total_volume] units of various reagents"
to_chat(user, "[total_volume] units of various reagents")
else
user << "Nothing."
to_chat(user, "Nothing.")
/atom/proc/relaymove()
return
@@ -406,7 +407,7 @@ var/list/blood_splatter_icons = list()
cur_y = y_arr.Find(src.z)
if(cur_y)
break
// world << "X = [cur_x]; Y = [cur_y]"
// to_chat(world, "X = [cur_x]; Y = [cur_y]")
if(cur_x && cur_y)
return list("x"=cur_x,"y"=cur_y)
else
@@ -423,6 +424,7 @@ var/list/blood_splatter_icons = list()
/atom/proc/handle_slip()
return
/atom/proc/singularity_act()
return
@@ -441,6 +443,12 @@ var/list/blood_splatter_icons = list()
/atom/proc/ratvar_act()
return
/atom/proc/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd)
return FALSE
/atom/proc/rcd_act(mob/user, obj/item/weapon/rcd/the_rcd, passed_mode)
return FALSE
/atom/proc/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
return 0
@@ -551,10 +559,6 @@ var/list/blood_splatter_icons = list()
/atom/vv_edit_var(var_name, var_value)
if(!Debug2)
admin_spawned = TRUE
switch(var_name)
if("luminosity")
src.SetLuminosity(var_value)
return//prevent normal setting of this value
. = ..()
switch(var_name)
if("color")
@@ -569,4 +573,3 @@ var/list/blood_splatter_icons = list()
.["Add reagent"] = "?_src_=vars;addreagent=\ref[src]"
.["Trigger EM pulse"] = "?_src_=vars;emp=\ref[src]"
.["Trigger explosion"] = "?_src_=vars;explode=\ref[src]"
+102 -14
View File
@@ -26,10 +26,14 @@
var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm
var/floating = FALSE
/atom/movable/SDQL_update(const/var_name, new_value)
if(var_name == "step_x" || var_name == "step_y" || var_name == "step_size" || var_name == "bound_x" || var_name == "bound_y" || var_name == "bound_width" || var_name == "bound_height")
/atom/movable/vv_edit_var(var_name, var_value)
var/static/list/banned_edits = list("step_x", "step_y", "step_size")
var/static/list/careful_edits = list("bound_x", "bound_y", "bound_width", "bound_height")
if(var_name in banned_edits)
return FALSE //PLEASE no.
. = ..()
if((var_name in careful_edits) && (var_value % world.icon_size) != 0)
return FALSE
return ..()
/atom/movable/Move(atom/newloc, direct = 0)
if(!loc || !newloc) return 0
@@ -87,16 +91,6 @@
//Called after a successful Move(). By this point, we've already moved
/atom/movable/proc/Moved(atom/OldLoc, Dir)
//Objects with opacity will trigger nearby lights of the old location to update at next SSlighting fire
if(opacity)
if (isturf(OldLoc))
OldLoc.UpdateAffectingLights()
if (isturf(loc))
loc.UpdateAffectingLights()
else
if(light)
light.changed()
if (!inertia_moving)
inertia_next_move = world.time + inertia_move_delay
newtonian_move(Dir)
@@ -111,7 +105,26 @@
orbiting.Check()
return 1
/atom/movable/Destroy()
/atom/movable/Destroy(force)
var/inform_admins = HAS_SECONDARY_FLAG(src, INFORM_ADMINS_ON_RELOCATE)
var/stationloving = HAS_SECONDARY_FLAG(src, STATIONLOVING)
if(inform_admins && force)
var/turf/T = get_turf(src)
message_admins("[src] has been !!force deleted!! in [ADMIN_COORDJMP(T)].")
log_game("[src] has been !!force deleted!! in [COORD(T)].")
if(stationloving && !force)
var/turf/currentturf = get_turf(src)
var/turf/targetturf = relocate()
log_game("[src] has been destroyed in [COORD(currentturf)]. Moving it to [COORD(targetturf)].")
if(inform_admins)
message_admins("[src] has been destroyed in [ADMIN_COORDJMP(currentturf)]. Moving it to [ADMIN_COORDJMP(targetturf)].")
return QDEL_HINT_LETMELIVE
if(stationloving && force)
STOP_PROCESSING(SSinbounds, src)
. = ..()
if(loc)
loc.handle_atom_del(src)
@@ -430,3 +443,78 @@
else if (!on && floating)
animate(src, pixel_y = initial(pixel_y), time = 10)
floating = FALSE
/* Stationloving
*
* A stationloving atom will always teleport back to the station
* if it ever leaves the station z-levels or Centcom. It will also,
* when Destroy() is called, will teleport to a random turf on the
* station.
*
* The turf is guaranteed to be "safe" for normal humans, probably.
* If the station is SUPER SMASHED UP, it might not work.
*
* Here are some important procs:
* relocate()
* moves the atom to a safe turf on the station
*
* check_in_bounds()
* regularly called and checks if `in_bounds()` returns true. If false, it
* triggers a `relocate()`.
*
* in_bounds()
* By default, checks that the atom's z is the station z or centcom.
*/
/atom/movable/proc/set_stationloving(state, inform_admins=FALSE)
var/currently = HAS_SECONDARY_FLAG(src, STATIONLOVING)
if(inform_admins)
SET_SECONDARY_FLAG(src, INFORM_ADMINS_ON_RELOCATE)
else
CLEAR_SECONDARY_FLAG(src, INFORM_ADMINS_ON_RELOCATE)
if(state == currently)
return
else if(!state)
STOP_PROCESSING(SSinbounds, src)
CLEAR_SECONDARY_FLAG(src, STATIONLOVING)
else
START_PROCESSING(SSinbounds, src)
SET_SECONDARY_FLAG(src, STATIONLOVING)
/atom/movable/proc/relocate()
var/targetturf = find_safe_turf(ZLEVEL_STATION)
if(!targetturf)
if(blobstart.len > 0)
targetturf = get_turf(pick(blobstart))
else
throw EXCEPTION("Unable to find a blobstart landmark")
if(ismob(loc))
var/mob/M = loc
M.transferItemToLoc(src, targetturf, TRUE) //nodrops disks when?
else if(istype(loc, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = loc
S.remove_from_storage(src, targetturf)
else
forceMove(targetturf)
// move the disc, so ghosts remain orbiting it even if it's "destroyed"
return targetturf
/atom/movable/proc/check_in_bounds()
if(in_bounds())
return
else
var/turf/currentturf = get_turf(src)
get(src, /mob) << "<span class='danger'>You can't help but feel that you just lost something back there...</span>"
var/turf/targetturf = relocate()
log_game("[src] has been moved out of bounds in [COORD(currentturf)]. Moving it to [COORD(targetturf)].")
if(HAS_SECONDARY_FLAG(src, INFORM_ADMINS_ON_RELOCATE))
message_admins("[src] has been moved out of bounds in [ADMIN_COORDJMP(currentturf)]. Moving it to [ADMIN_COORDJMP(targetturf)].")
/atom/movable/proc/in_bounds()
. = FALSE
var/turf/currentturf = get_turf(src)
if(currentturf && (currentturf.z == ZLEVEL_CENTCOM || currentturf.z == ZLEVEL_STATION))
. = TRUE
+3 -3
View File
@@ -245,12 +245,12 @@ var/list/pointers = list()
if(!holder)
return
src << "There are [pointers.len] pointers:"
to_chat(src, "There are [pointers.len] pointers:")
for(var/p in pointers)
src << p
to_chat(src, p)
var/datum/signal/S = locate(p)
if(istype(S))
src << S.debug_print()
to_chat(src, S.debug_print())
/obj/proc/receive_signal(datum/signal/signal, receive_method, receive_param)
return
+11 -1
View File
@@ -45,7 +45,7 @@
hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD, WANTED_HUD)
/datum/atom_hud/data/diagnostic
hud_icons = list (DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_TRACK_HUD)
hud_icons = list (DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_TRACK_HUD, DIAG_AIRLOCK_HUD)
/* MED/SEC/DIAG HUD HOOKS */
@@ -380,3 +380,13 @@
holder.icon_state = "hudmove"
else
holder.icon_state = ""
/*~~~~~~~~~~~~
Airlocks!
~~~~~~~~~~~~~*/
/obj/machinery/door/airlock/proc/diag_hud_set_electrified()
var/image/holder = hud_list[DIAG_AIRLOCK_HUD]
if(secondsElectrified != 0)
holder.icon_state = "electrified"
else
holder.icon_state = ""
+21 -21
View File
@@ -54,12 +54,12 @@
H.set_machine(src)
if(href_list["school"])
if(used)
H << "You already used this contract!"
to_chat(H, "You already used this contract!")
return
var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src)
if(candidates.len)
if(used)
H << "You already used this contract!"
to_chat(H, "You already used this contract!")
return
used = 1
var/mob/dead/observer/theghost = pick(candidates)
@@ -67,7 +67,7 @@
if(H && H.mind)
ticker.mode.update_wiz_icons_added(H.mind)
else
H << "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later."
to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.")
/obj/item/weapon/antag_spawner/contract/spawn_antag(client/C, turf/T, type = "")
new /obj/effect/particle_effect/smoke(T)
@@ -77,25 +77,25 @@
var/wizard_name = "the wizard"
if(usr)
wizard_name = usr.real_name
M << "<B>You are [wizard_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals."
to_chat(M, "<B>You are [wizard_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals.")
switch(type)
if("destruction")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null))
M << "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball."
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.")
if("bluespace")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
M << "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt."
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.")
if("healing")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null))
M.put_in_hands_or_del(new /obj/item/weapon/gun/magic/staff/healing(M))
M << "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned livesaving survival spells. You are able to cast charge and forcewall."
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.")
if("robeless")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null))
M << "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap."
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.")
equip_antag(M)
var/wizard_name_first = pick(wizard_first)
@@ -140,13 +140,13 @@
/obj/item/weapon/antag_spawner/nuke_ops/proc/check_usability(mob/user)
if(used)
user << "<span class='warning'>[src] is out of power!</span>"
to_chat(user, "<span class='warning'>[src] is out of power!</span>")
return 0
if(!(user.mind in ticker.mode.syndicates))
user << "<span class='danger'>AUTHENTICATION FAILURE. ACCESS DENIED.</span>"
to_chat(user, "<span class='danger'>AUTHENTICATION FAILURE. ACCESS DENIED.</span>")
return 0
if(user.z != ZLEVEL_CENTCOM)
user << "<span class='warning'>[src] is out of range! It can only be used at your base!</span>"
to_chat(user, "<span class='warning'>[src] is out of range! It can only be used at your base!</span>")
return 0
return 1
@@ -167,7 +167,7 @@
S.start()
qdel(src)
else
user << "<span class='warning'>Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.</span>"
to_chat(user, "<span class='warning'>Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.</span>")
/obj/item/weapon/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
@@ -236,7 +236,7 @@
/obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user)
if(user.z != 1)
user << "<span class='notice'>You should probably wait until you reach the station.</span>"
to_chat(user, "<span class='notice'>You should probably wait until you reach the station.</span>")
return
if(used)
return
@@ -247,12 +247,12 @@
used = 1
var/mob/dead/observer/theghost = pick(demon_candidates)
spawn_antag(theghost.client, get_turf(src), initial(demon_type.name))
user << shatter_msg
user << veil_msg
to_chat(user, shatter_msg)
to_chat(user, veil_msg)
playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1)
qdel(src)
else
user << "<span class='notice'>You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.</span>"
to_chat(user, "<span class='notice'>You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.</span>")
/obj/item/weapon/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, type = "")
@@ -275,12 +275,12 @@
new_objective2.owner = S.mind
new_objective2.explanation_text = "[objective_verb] everyone[usr ? " else while you're at it":""]."
S.mind.objectives += new_objective2
S << S.playstyle_string
S << "<B>You are currently not currently in the same plane of existence as the station. \
Ctrl+Click a blood pool to manifest.</B>"
to_chat(S, S.playstyle_string)
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. \
Ctrl+Click a blood pool to manifest.</B>")
if(new_objective)
S << "<B>Objective #[1]</B>: [new_objective.explanation_text]"
S << "<B>Objective #[new_objective ? "[2]":"[1]"]</B>: [new_objective2.explanation_text]"
to_chat(S, "<B>Objective #[1]</B>: [new_objective.explanation_text]")
to_chat(S, "<B>Objective #[new_objective ? "[2]":"[1]"]</B>: [new_objective2.explanation_text]")
/obj/item/weapon/antag_spawner/slaughter_demon/laughter
name = "vial of tickles"
+10 -10
View File
@@ -70,9 +70,10 @@ var/list/blobs_legit = list() //used for win-score calculations, contains only b
/datum/game_mode/blob/proc/show_message(message)
for(var/datum/mind/blob in blob_overminds)
blob.current << message
to_chat(blob.current, message)
/datum/game_mode/blob/post_setup()
set waitfor = FALSE
for(var/datum/mind/blob in blob_overminds)
var/mob/camera/blob/B = blob.current.become_overmind(TRUE, round(blob_base_starting_points/blob_overminds.len))
@@ -88,16 +89,15 @@ var/list/blobs_legit = list() //used for win-score calculations, contains only b
if(B)
B.max_occurrences = 0 // disable the event
spawn(0)
var/message_delay = rand(messagedelay_low, messagedelay_high) //between 4 and 6 minutes with 2400 low and 3600 high.
. = ..()
sleep(message_delay)
var/message_delay = rand(messagedelay_low, messagedelay_high) //between 4 and 6 minutes with 2400 low and 3600 high.
send_intercept(1)
message_sent = TRUE
sleep(message_delay)
sleep(24000) //40 minutes, plus burst_delay*3(minimum of 6 minutes, maximum of 8)
if(!replacementmode)
send_intercept(2) //if the blob has been alive this long, it's time to bomb it
send_intercept(1)
message_sent = TRUE
return ..()
sleep(24000) //40 minutes, plus burst_delay*3(minimum of 6 minutes, maximum of 8)
if(!replacementmode)
send_intercept(2) //if the blob has been alive this long, it's time to bomb it
+7 -7
View File
@@ -21,24 +21,24 @@
..()
if(blobwincount <= blobs_legit.len)
feedback_set_details("round_end_result","win - blob took over")
world << "<FONT size = 3><B>The blob has taken over the station!</B></FONT>"
world << "<B>The entire station was eaten by the Blob!</B>"
to_chat(world, "<FONT size = 3><B>The blob has taken over the station!</B></FONT>")
to_chat(world, "<B>The entire station was eaten by the Blob!</B>")
log_game("Blob mode completed with a blob victory.")
ticker.news_report = BLOB_WIN
else if(station_was_nuked)
feedback_set_details("round_end_result","halfwin - nuke")
world << "<FONT size = 3><B>Partial Win: The station has been destroyed!</B></FONT>"
world << "<B>Directive 7-12 has been successfully carried out, preventing the Blob from spreading.</B>"
to_chat(world, "<FONT size = 3><B>Partial Win: The station has been destroyed!</B></FONT>")
to_chat(world, "<B>Directive 7-12 has been successfully carried out, preventing the Blob from spreading.</B>")
log_game("Blob mode completed with a tie (station destroyed).")
ticker.news_report = BLOB_NUKE
else if(!blob_cores.len)
feedback_set_details("round_end_result","loss - blob eliminated")
world << "<FONT size = 3><B>The staff has won!</B></FONT>"
world << "<B>The alien organism has been eradicated from the station!</B>"
to_chat(world, "<FONT size = 3><B>The staff has won!</B></FONT>")
to_chat(world, "<B>The alien organism has been eradicated from the station!</B>")
log_game("Blob mode completed with a crew victory.")
ticker.news_report = BLOB_DESTROYED
@@ -68,5 +68,5 @@
var/text = "<FONT size = 2><B>The blob[(blob_mode.blob_overminds.len > 1 ? "s were" : " was")]:</B></FONT>"
for(var/datum/mind/blob in blob_mode.blob_overminds)
text += printplayer(blob)
world << text
to_chat(world, text)
return 1
+3 -5
View File
@@ -13,7 +13,7 @@
intercepttext += " 2. If found, use any neccesary means to contain and destroy the organism.<BR>"
intercepttext += " 3. Avoid damage to the capital infrastructure of the station.<BR>"
intercepttext += "<BR>Note in the event of a quarantine breach or uncontrolled spread of the biohazard, <b>Biohazard Response Procedure 5-12</b> may be issued.<BR>"
print_command_report(intercepttext,"Level 5-6 Biohazard Response Procedures")
print_command_report(text=intercepttext,title="Level 5-6 Biohazard Response Procedures",announce=FALSE)
priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
if(2)
var/nukecode = random_nukecode()
@@ -29,8 +29,7 @@
intercepttext += "1. Secure the Nuclear Authentication Disk.<BR>"
intercepttext += "2. Detonate the Nuke located in the vault.<BR>"
intercepttext += "Nuclear Authentication Code: [nukecode] <BR>"
print_command_report(intercepttext,"Classified [command_name()] Update")
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg')
print_command_report(text=intercepttext,announce=TRUE)
for(var/mob/living/silicon/ai/aiPlayer in player_list)
if (aiPlayer.client)
@@ -38,7 +37,6 @@
aiPlayer.set_zeroth_law(law)
else
..()
return
@@ -99,7 +97,7 @@
if(valid_territories.len)
num_territories = valid_territories.len //Add them all up to make the total number of area types
else
world << "ERROR: NO VALID TERRITORIES"
to_chat(world, "ERROR: NO VALID TERRITORIES")
/datum/station_state/proc/score(datum/station_state/result)
if(!result)
+4 -4
View File
@@ -68,10 +68,10 @@
var/rendered = "<font color=\"#EE4000\"><b>\[Blob Telepathy\] [real_name]</b> [spanned_message]</font>"
for(var/M in mob_list)
if(isovermind(M) || istype(M, /mob/living/simple_animal/hostile/blob))
M << rendered
to_chat(M, rendered)
if(isobserver(M))
var/link = FOLLOW_LINK(M, src)
M << "[link] [rendered]"
to_chat(M, "[link] [rendered]")
////////////////
// BLOB SPORE //
@@ -102,7 +102,7 @@
var/is_zombie = 0
gold_core_spawnable = 1
/mob/living/simple_animal/hostile/blob/blobspore/New(loc, var/obj/structure/blob/factory/linked_node)
/mob/living/simple_animal/hostile/blob/blobspore/Initialize(mapload, var/obj/structure/blob/factory/linked_node)
if(istype(linked_node))
factory = linked_node
factory.spores += src
@@ -222,7 +222,7 @@
see_in_dark = 8
var/independent = FALSE
/mob/living/simple_animal/hostile/blob/blobbernaut/New()
/mob/living/simple_animal/hostile/blob/blobbernaut/Initialize()
..()
if(!independent) //no pulling people deep into the blob
verbs -= /mob/living/verb/pulled
+1 -1
View File
@@ -25,7 +25,7 @@
spore.factory = null
if(naut)
naut.factory = null
naut << "<span class='userdanger'>Your factory was destroyed! You feel yourself dying!</span>"
to_chat(naut, "<span class='userdanger'>Your factory was destroyed! You feel yourself dying!</span>")
naut.throw_alert("nofactory", /obj/screen/alert/nofactory)
spores = null
return ..()
+8 -8
View File
@@ -29,7 +29,7 @@
var/manualplace_min_time = 600 //in deciseconds //a minute, to get bearings
var/autoplace_max_time = 3600 //six minutes, as long as should be needed
/mob/camera/blob/New(loc, pre_placed = 0, mode_made = 0, starting_points = 60)
/mob/camera/blob/Initialize(mapload, pre_placed = 0, mode_made = 0, starting_points = 60)
blob_points = starting_points
if(pre_placed) //we already have a core!
manualplace_min_time = 0
@@ -61,8 +61,8 @@
if(!blob_core)
if(!placed)
if(manualplace_min_time && world.time >= manualplace_min_time)
src << "<b><span class='big'><font color=\"#EE4000\">You may now place your blob core.</font></span></b>"
src << "<span class='big'><font color=\"#EE4000\">You will automatically place your blob core in [round((autoplace_max_time - world.time)/600, 0.5)] minutes.</font></span>"
to_chat(src, "<b><span class='big'><font color=\"#EE4000\">You may now place your blob core.</font></span></b>")
to_chat(src, "<span class='big'><font color=\"#EE4000\">You will automatically place your blob core in [round((autoplace_max_time - world.time)/600, 0.5)] minutes.</font></span>")
manualplace_min_time = 0
if(autoplace_max_time && world.time >= autoplace_max_time)
place_blob_core(base_point_rate, 1)
@@ -92,7 +92,7 @@
/mob/camera/blob/Login()
..()
sync_mind()
src << "<span class='notice'>You are the overmind!</span>"
to_chat(src, "<span class='notice'>You are the overmind!</span>")
blob_help()
update_health_hud()
add_points(0)
@@ -100,7 +100,7 @@
/mob/camera/blob/examine(mob/user)
..()
if(blob_reagent_datum)
user << "Its chemical is <font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</font>."
to_chat(user, "Its chemical is <font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</font>.")
/mob/camera/blob/update_health_hud()
if(blob_core)
@@ -119,7 +119,7 @@
if (src.client)
if(client.prefs.muted & MUTE_IC)
src << "You cannot send IC messages (muted)."
to_chat(src, "You cannot send IC messages (muted).")
return
if (src.client.handle_spam_prevention(message,MUTE_IC))
return
@@ -142,10 +142,10 @@
for(var/mob/M in mob_list)
if(isovermind(M) || istype(M, /mob/living/simple_animal/hostile/blob))
M << rendered
to_chat(M, rendered)
if(isobserver(M))
var/link = FOLLOW_LINK(M, src)
M << "[link] [rendered]"
to_chat(M, "[link] [rendered]")
/mob/camera/blob/emote(act,m_type=1,message = null)
return
+54 -54
View File
@@ -1,6 +1,6 @@
/mob/camera/blob/proc/can_buy(cost = 15)
if(blob_points < cost)
src << "<span class='warning'>You cannot afford this, you need at least [cost] resources!</span>"
to_chat(src, "<span class='warning'>You cannot afford this, you need at least [cost] resources!</span>")
return 0
add_points(-cost)
return 1
@@ -15,30 +15,30 @@
if("blob" in M.faction)
continue
if(M.client)
src << "<span class='warning'>There is someone too close to place your blob core!</span>"
to_chat(src, "<span class='warning'>There is someone too close to place your blob core!</span>")
return 0
for(var/mob/living/M in view(13, src))
if("blob" in M.faction)
continue
if(M.client)
src << "<span class='warning'>Someone could see your blob core from here!</span>"
to_chat(src, "<span class='warning'>Someone could see your blob core from here!</span>")
return 0
var/turf/T = get_turf(src)
if(T.density)
src << "<span class='warning'>This spot is too dense to place a blob core on!</span>"
to_chat(src, "<span class='warning'>This spot is too dense to place a blob core on!</span>")
return 0
for(var/obj/O in T)
if(istype(O, /obj/structure/blob))
if(istype(O, /obj/structure/blob/normal))
qdel(O)
else
src << "<span class='warning'>There is already a blob here!</span>"
to_chat(src, "<span class='warning'>There is already a blob here!</span>")
return 0
else if(O.density)
src << "<span class='warning'>This spot is too dense to place a blob core on!</span>"
to_chat(src, "<span class='warning'>This spot is too dense to place a blob core on!</span>")
return 0
if(world.time <= manualplace_min_time && world.time <= autoplace_max_time)
src << "<span class='warning'>It is too early to place your blob core!</span>"
to_chat(src, "<span class='warning'>It is too early to place your blob core!</span>")
return 0
else if(placement_override == 1)
var/turf/T = pick(blobstart)
@@ -80,19 +80,19 @@
T = get_turf(src)
var/obj/structure/blob/B = (locate(/obj/structure/blob) in T)
if(!B)
src << "<span class='warning'>There is no blob here!</span>"
to_chat(src, "<span class='warning'>There is no blob here!</span>")
return
if(!istype(B, /obj/structure/blob/normal))
src << "<span class='warning'>Unable to use this blob, find a normal one.</span>"
to_chat(src, "<span class='warning'>Unable to use this blob, find a normal one.</span>")
return
if(needsNode && nodes_required)
if(!(locate(/obj/structure/blob/node) in orange(3, T)) && !(locate(/obj/structure/blob/core) in orange(4, T)))
src << "<span class='warning'>You need to place this blob closer to a node or core!</span>"
to_chat(src, "<span class='warning'>You need to place this blob closer to a node or core!</span>")
return //handholdotron 2000
if(nearEquals)
for(var/obj/structure/blob/L in orange(nearEquals, T))
if(L.type == blobType)
src << "<span class='warning'>There is a similar blob nearby, move more than [nearEquals] tiles away from it!</span>"
to_chat(src, "<span class='warning'>There is a similar blob nearby, move more than [nearEquals] tiles away from it!</span>")
return
if(!can_buy(price))
return
@@ -105,9 +105,9 @@
set desc = "Toggle requiring nodes to place resource and factory blobs."
nodes_required = !nodes_required
if(nodes_required)
src << "<span class='warning'>You now require a nearby node or core to place factory and resource blobs.</span>"
to_chat(src, "<span class='warning'>You now require a nearby node or core to place factory and resource blobs.</span>")
else
src << "<span class='warning'>You no longer require a nearby node or core to place factory and resource blobs.</span>"
to_chat(src, "<span class='warning'>You no longer require a nearby node or core to place factory and resource blobs.</span>")
/mob/camera/blob/verb/create_shield_power()
set category = "Blob"
@@ -143,13 +143,13 @@
var/turf/T = get_turf(src)
var/obj/structure/blob/factory/B = locate(/obj/structure/blob/factory) in T
if(!B)
src << "<span class='warning'>You must be on a factory blob!</span>"
to_chat(src, "<span class='warning'>You must be on a factory blob!</span>")
return
if(B.naut) //if it already made a blobbernaut, it can't do it again
src << "<span class='warning'>This factory blob is already sustaining a blobbernaut.</span>"
to_chat(src, "<span class='warning'>This factory blob is already sustaining a blobbernaut.</span>")
return
if(B.obj_integrity < B.max_integrity * 0.5)
src << "<span class='warning'>This factory blob is too damaged to sustain a blobbernaut.</span>"
to_chat(src, "<span class='warning'>This factory blob is too damaged to sustain a blobbernaut.</span>")
return
if(!can_buy(40))
return
@@ -173,11 +173,11 @@
blobber.key = C.key
blobber << 'sound/effects/blobattack.ogg'
blobber << 'sound/effects/attackblob.ogg'
blobber << "<b>You are a blobbernaut!</b>"
blobber << "You are powerful, hard to kill, and slowly regenerate near nodes and cores, but will slowly die if not near the blob or if the factory that made you is killed."
blobber << "You can communicate with other blobbernauts and overminds via <b>:b</b>"
blobber << "Your overmind's blob reagent is: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!"
blobber << "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]"
to_chat(blobber, "<b>You are a blobbernaut!</b>")
to_chat(blobber, "You are powerful, hard to kill, and slowly regenerate near nodes and cores, but will slowly die if not near the blob or if the factory that made you is killed.")
to_chat(blobber, "You can communicate with other blobbernauts and overminds via <b>:b</b>")
to_chat(blobber, "Your overmind's blob reagent is: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!")
to_chat(blobber, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]")
if(blobber)
blobber.notransform = 0
@@ -188,14 +188,14 @@
var/turf/T = get_turf(src)
var/obj/structure/blob/node/B = locate(/obj/structure/blob/node) in T
if(!B)
src << "<span class='warning'>You must be on a blob node!</span>"
to_chat(src, "<span class='warning'>You must be on a blob node!</span>")
return
if(!blob_core)
src << "<span class='userdanger'>You have no core and are about to die! May you rest in peace.</span>"
to_chat(src, "<span class='userdanger'>You have no core and are about to die! May you rest in peace.</span>")
return
var/area/A = get_area(T)
if(isspaceturf(T) || A && !A.blob_allowed)
src << "<span class='warning'>You cannot relocate your core here!</span>"
to_chat(src, "<span class='warning'>You cannot relocate your core here!</span>")
return
if(!can_buy(80))
return
@@ -216,17 +216,17 @@
/mob/camera/blob/proc/remove_blob(turf/T)
var/obj/structure/blob/B = locate() in T
if(!B)
src << "<span class='warning'>There is no blob there!</span>"
to_chat(src, "<span class='warning'>There is no blob there!</span>")
return
if(B.point_return < 0)
src << "<span class='warning'>Unable to remove this blob.</span>"
to_chat(src, "<span class='warning'>Unable to remove this blob.</span>")
return
if(max_blob_points < B.point_return + blob_points)
src << "<span class='warning'>You have too many resources to remove this blob!</span>"
to_chat(src, "<span class='warning'>You have too many resources to remove this blob!</span>")
return
if(B.point_return)
add_points(B.point_return)
src << "<span class='notice'>Gained [B.point_return] resources from removing \the [B].</span>"
to_chat(src, "<span class='notice'>Gained [B.point_return] resources from removing \the [B].</span>")
qdel(B)
/mob/camera/blob/verb/expand_blob_power()
@@ -243,7 +243,7 @@
for(var/obj/structure/blob/AB in range(T, 1))
possibleblobs += AB
if(!possibleblobs.len)
src << "<span class='warning'>There is no blob adjacent to the target tile!</span>"
to_chat(src, "<span class='warning'>There is no blob adjacent to the target tile!</span>")
return
if(can_buy(4))
var/attacksuccess = FALSE
@@ -260,7 +260,7 @@
if(attacksuccess) //if we successfully attacked a turf with a blob on it, don't refund shit
B.blob_attack_animation(T, src)
else
src << "<span class='warning'>There is a blob there!</span>"
to_chat(src, "<span class='warning'>There is a blob there!</span>")
add_points(4) //otherwise, refund all of the cost
else
var/list/cardinalblobs = list()
@@ -295,7 +295,7 @@
rally_spores(T)
/mob/camera/blob/proc/rally_spores(turf/T)
src << "You rally your spores."
to_chat(src, "You rally your spores.")
var/list/surrounding_turfs = block(locate(T.x - 1, T.y - 1, T.z), locate(T.x + 1, T.y + 1, T.z))
if(!surrounding_turfs.len)
return
@@ -312,7 +312,7 @@
if(!speak_text)
return
else
src << "You broadcast with your minions, <B>[speak_text]</B>"
to_chat(src, "You broadcast with your minions, <B>[speak_text]</B>")
for(var/BLO in blob_mobs)
var/mob/living/simple_animal/hostile/blob/BM = BLO
if(BM.stat == CONSCIOUS)
@@ -337,33 +337,33 @@
for(var/BLO in blob_mobs)
var/mob/living/simple_animal/hostile/blob/BM = BLO
BM.update_icons() //If it's getting a new chemical, tell it what it does!
BM << "Your overmind's blob reagent is now: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!"
BM << "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]"
src << "Your reagent is now: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!"
src << "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.description]"
to_chat(BM, "Your overmind's blob reagent is now: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!")
to_chat(BM, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]")
to_chat(src, "Your reagent is now: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!")
to_chat(src, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.description]")
if(blob_reagent_datum.effectdesc)
src << "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.effectdesc]"
to_chat(src, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.effectdesc]")
/mob/camera/blob/verb/blob_help()
set category = "Blob"
set name = "*Blob Help*"
set desc = "Help on how to blob."
src << "<b>As the overmind, you can control the blob!</b>"
src << "Your blob reagent is: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!"
src << "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.description]"
to_chat(src, "<b>As the overmind, you can control the blob!</b>")
to_chat(src, "Your blob reagent is: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!")
to_chat(src, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.description]")
if(blob_reagent_datum.effectdesc)
src << "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.effectdesc]"
src << "<b>You can expand, which will attack people, damage objects, or place a Normal Blob if the tile is clear.</b>"
src << "<i>Normal Blobs</i> will expand your reach and can be upgraded into special blobs that perform certain functions."
src << "<b>You can upgrade normal blobs into the following types of blob:</b>"
src << "<i>Shield Blobs</i> are strong and expensive blobs which take more damage. In additon, they are fireproof and can block air, use these to protect yourself from station fires."
src << "<i>Resource Blobs</i> are blobs which produce more resources for you, build as many of these as possible to consume the station. This type of blob must be placed near node blobs or your core to work."
src << "<i>Factory Blobs</i> are blobs that spawn blob spores which will attack nearby enemies. This type of blob must be placed near node blobs or your core to work."
src << "<i>Blobbernauts</i> can be produced from factories for a cost, and are hard to kill, powerful, and moderately smart. The factory used to create one will become fragile and briefly unable to produce spores."
src << "<i>Node Blobs</i> are blobs which grow, like the core. Like the core it can activate resource and factory blobs."
src << "<b>In addition to the buttons on your HUD, there are a few click shortcuts to speed up expansion and defense.</b>"
src << "<b>Shortcuts:</b> Click = Expand Blob <b>|</b> Middle Mouse Click = Rally Spores <b>|</b> Ctrl Click = Create Shield Blob <b>|</b> Alt Click = Remove Blob"
src << "Attempting to talk will send a message to all other overminds, allowing you to coordinate with them."
to_chat(src, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.effectdesc]")
to_chat(src, "<b>You can expand, which will attack people, damage objects, or place a Normal Blob if the tile is clear.</b>")
to_chat(src, "<i>Normal Blobs</i> will expand your reach and can be upgraded into special blobs that perform certain functions.")
to_chat(src, "<b>You can upgrade normal blobs into the following types of blob:</b>")
to_chat(src, "<i>Shield Blobs</i> are strong and expensive blobs which take more damage. In additon, they are fireproof and can block air, use these to protect yourself from station fires.")
to_chat(src, "<i>Resource Blobs</i> are blobs which produce more resources for you, build as many of these as possible to consume the station. This type of blob must be placed near node blobs or your core to work.")
to_chat(src, "<i>Factory Blobs</i> are blobs that spawn blob spores which will attack nearby enemies. This type of blob must be placed near node blobs or your core to work.")
to_chat(src, "<i>Blobbernauts</i> can be produced from factories for a cost, and are hard to kill, powerful, and moderately smart. The factory used to create one will become fragile and briefly unable to produce spores.")
to_chat(src, "<i>Node Blobs</i> are blobs which grow, like the core. Like the core it can activate resource and factory blobs.")
to_chat(src, "<b>In addition to the buttons on your HUD, there are a few click shortcuts to speed up expansion and defense.</b>")
to_chat(src, "<b>Shortcuts:</b> Click = Expand Blob <b>|</b> Middle Mouse Click = Rally Spores <b>|</b> Ctrl Click = Create Shield Blob <b>|</b> Alt Click = Remove Blob")
to_chat(src, "Attempting to talk will send a message to all other overminds, allowing you to coordinate with them.")
if(!placed && autoplace_max_time <= world.time)
src << "<span class='big'><font color=\"#EE4000\">You will automatically place your blob core in [round((autoplace_max_time - world.time)/600, 0.5)] minutes.</font></span>"
src << "<span class='big'><font color=\"#EE4000\">You [manualplace_min_time ? "will be able to":"can"] manually place your blob core by pressing the Place Blob Core button in the bottom right corner of the screen.</font></span>"
to_chat(src, "<span class='big'><font color=\"#EE4000\">You will automatically place your blob core in [round((autoplace_max_time - world.time)/600, 0.5)] minutes.</font></span>")
to_chat(src, "<span class='big'><font color=\"#EE4000\">You [manualplace_min_time ? "will be able to":"can"] manually place your blob core by pressing the Place Blob Core button in the bottom right corner of the screen.</font></span>")
+12 -12
View File
@@ -2,7 +2,7 @@
/obj/structure/blob
name = "blob"
icon = 'icons/mob/blob.dmi'
luminosity = 1
light_range = 2
desc = "A thick wall of writhing tendrils."
density = 0 //this being 0 causes two bugs, being able to attack blob tiles behind other blobs and being unable to move on blob tiles in no gravity, but turning it to 1 causes the blob mobs to be unable to path through blobs, which is probably worse.
opacity = 0
@@ -229,7 +229,7 @@
/obj/structure/blob/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/device/analyzer))
user.changeNext_move(CLICK_CD_MELEE)
user << "<b>The analyzer beeps once, then reports:</b><br>"
to_chat(user, "<b>The analyzer beeps once, then reports:</b><br>")
user << 'sound/machines/ping.ogg'
chemeffectreport(user)
typereport(user)
@@ -238,16 +238,16 @@
/obj/structure/blob/proc/chemeffectreport(mob/user)
if(overmind)
user << "<b>Material: <font color=\"[overmind.blob_reagent_datum.color]\">[overmind.blob_reagent_datum.name]</font><span class='notice'>.</span></b>"
user << "<b>Material Effects:</b> <span class='notice'>[overmind.blob_reagent_datum.analyzerdescdamage]</span>"
user << "<b>Material Properties:</b> <span class='notice'>[overmind.blob_reagent_datum.analyzerdesceffect]</span><br>"
to_chat(user, "<b>Material: <font color=\"[overmind.blob_reagent_datum.color]\">[overmind.blob_reagent_datum.name]</font><span class='notice'>.</span></b>")
to_chat(user, "<b>Material Effects:</b> <span class='notice'>[overmind.blob_reagent_datum.analyzerdescdamage]</span>")
to_chat(user, "<b>Material Properties:</b> <span class='notice'>[overmind.blob_reagent_datum.analyzerdesceffect]</span><br>")
else
user << "<b>No Material Detected!</b><br>"
to_chat(user, "<b>No Material Detected!</b><br>")
/obj/structure/blob/proc/typereport(mob/user)
user << "<b>Blob Type:</b> <span class='notice'>[uppertext(initial(name))]</span>"
user << "<b>Health:</b> <span class='notice'>[obj_integrity]/[max_integrity]</span>"
user << "<b>Effects:</b> <span class='notice'>[scannerreport()]</span>"
to_chat(user, "<b>Blob Type:</b> <span class='notice'>[uppertext(initial(name))]</span>")
to_chat(user, "<b>Health:</b> <span class='notice'>[obj_integrity]/[max_integrity]</span>")
to_chat(user, "<b>Effects:</b> <span class='notice'>[scannerreport()]</span>")
/obj/structure/blob/attack_animal(mob/living/simple_animal/M)
if("blob" in M.faction) //sorry, but you can't kill the blob as a blobbernaut
@@ -308,11 +308,11 @@
..()
var/datum/atom_hud/hud_to_check = huds[DATA_HUD_MEDICAL_ADVANCED]
if(user.research_scanner || (user in hud_to_check.hudusers))
user << "<b>Your HUD displays an extensive report...</b><br>"
to_chat(user, "<b>Your HUD displays an extensive report...</b><br>")
chemeffectreport(user)
typereport(user)
else
user << "It seems to be made of [get_chem_name()]."
to_chat(user, "It seems to be made of [get_chem_name()].")
/obj/structure/blob/proc/scannerreport()
return "A generic blob. Looks like someone forgot to override this proc, adminhelp this."
@@ -325,7 +325,7 @@
/obj/structure/blob/normal
name = "normal blob"
icon_state = "blob"
luminosity = 0
light_range = 0
obj_integrity = 21
max_integrity = 25
health_regen = 1
+12 -12
View File
@@ -18,7 +18,7 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
antag_flag = ROLE_CHANGELING
restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain")
required_players = 10
required_players = 15
required_enemies = 1
recommended_enemies = 4
reroll_friendly = 1
@@ -197,19 +197,19 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
/datum/game_mode/proc/greet_changeling(datum/mind/changeling, you_are=1)
if (you_are)
changeling.current << "<span class='boldannounce'>You are [changeling.changeling.changelingID], a changeling! You have absorbed and taken the form of a human.</span>"
changeling.current << "<span class='boldannounce'>Use say \":g message\" to communicate with your fellow changelings.</span>"
changeling.current << "<b>You must complete the following tasks:</b>"
to_chat(changeling.current, "<span class='boldannounce'>You are [changeling.changeling.changelingID], a changeling! You have absorbed and taken the form of a human.</span>")
to_chat(changeling.current, "<span class='boldannounce'>Use say \":g message\" to communicate with your fellow changelings.</span>")
to_chat(changeling.current, "<b>You must complete the following tasks:</b>")
if (changeling.current.mind)
var/mob/living/carbon/human/H = changeling.current
if(H.mind.assigned_role == "Clown")
H << "You have evolved beyond your clownish nature, allowing you to wield weapons without harming yourself."
to_chat(H, "You have evolved beyond your clownish nature, allowing you to wield weapons without harming yourself.")
H.dna.remove_mutation(CLOWNMUT)
var/obj_count = 1
for(var/datum/objective/objective in changeling.objectives)
changeling.current << "<b>Objective #[obj_count]</b>: [objective.explanation_text]"
to_chat(changeling.current, "<b>Objective #[obj_count]</b>: [objective.explanation_text]")
obj_count++
return
@@ -269,7 +269,7 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
feedback_add_details("changeling_success","FAIL")
text += "<br>"
world << text
to_chat(world, text)
return 1
@@ -351,25 +351,25 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
var/datum/changelingprofile/prof = stored_profiles[1]
if(prof.dna == user.dna && stored_profiles.len >= dna_max)//If our current DNA is the stalest, we gotta ditch it.
if(verbose)
user << "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>"
to_chat(user, "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>")
return
if(!target)
return
if((target.disabilities & NOCLONE) || (target.disabilities & HUSK))
if(verbose)
user << "<span class='warning'>DNA of [target] is ruined beyond usability!</span>"
to_chat(user, "<span class='warning'>DNA of [target] is ruined beyond usability!</span>")
return
if(!ishuman(target))//Absorbing monkeys is entirely possible, but it can cause issues with transforming. That's what lesser form is for anyway!
if(verbose)
user << "<span class='warning'>We could gain no benefit from absorbing a lesser creature.</span>"
to_chat(user, "<span class='warning'>We could gain no benefit from absorbing a lesser creature.</span>")
return
if(has_dna(target.dna))
if(verbose)
user << "<span class='warning'>We already have this DNA in storage!</span>"
to_chat(user, "<span class='warning'>We already have this DNA in storage!</span>")
return
if(!target.has_dna())
if(verbose)
user << "<span class='warning'>[target] is not compatible with our biology.</span>"
to_chat(user, "<span class='warning'>[target] is not compatible with our biology.</span>")
return
return 1
@@ -54,23 +54,23 @@
if(!ishuman(user) && !ismonkey(user)) //typecast everything from mob to carbon from this point onwards
return 0
if(req_human && !ishuman(user))
user << "<span class='warning'>We cannot do that in this form!</span>"
to_chat(user, "<span class='warning'>We cannot do that in this form!</span>")
return 0
var/datum/changeling/c = user.mind.changeling
if(c.chem_charges < chemical_cost)
user << "<span class='warning'>We require at least [chemical_cost] unit\s of chemicals to do that!</span>"
to_chat(user, "<span class='warning'>We require at least [chemical_cost] unit\s of chemicals to do that!</span>")
return 0
if(c.absorbedcount < req_dna)
user << "<span class='warning'>We require at least [req_dna] sample\s of compatible DNA.</span>"
to_chat(user, "<span class='warning'>We require at least [req_dna] sample\s of compatible DNA.</span>")
return 0
if(req_stat < user.stat)
user << "<span class='warning'>We are incapacitated.</span>"
to_chat(user, "<span class='warning'>We are incapacitated.</span>")
return 0
if((user.status_flags & FAKEDEATH) && (!ignores_fakedeath))
user << "<span class='warning'>We are incapacitated.</span>"
to_chat(user, "<span class='warning'>We are incapacitated.</span>")
return 0
if(c.geneticdamage > max_genetic_damage)
user << "<span class='warning'>Our genomes are still reassembling. We need time to recover first.</span>"
to_chat(user, "<span class='warning'>Our genomes are still reassembling. We need time to recover first.</span>")
return 0
return 1
@@ -8,27 +8,27 @@
thepower = S
if(thepower == null)
user << "This is awkward. Changeling power purchase failed, please report this bug to a coder!"
to_chat(user, "This is awkward. Changeling power purchase failed, please report this bug to a coder!")
return
if(absorbedcount < thepower.req_dna)
user << "We lack the energy to evolve this ability!"
to_chat(user, "We lack the energy to evolve this ability!")
return
if(has_sting(thepower))
user << "We have already evolved this ability!"
to_chat(user, "We have already evolved this ability!")
return
if(thepower.dna_cost < 0)
user << "We cannot evolve this ability."
to_chat(user, "We cannot evolve this ability.")
return
if(geneticpoints < thepower.dna_cost)
user << "We have reached our capacity for abilities."
to_chat(user, "We have reached our capacity for abilities.")
return
if(user.status_flags & FAKEDEATH)//To avoid potential exploits by buying new powers while in stasis, which clears your verblist.
user << "We lack the energy to evolve new abilities right now."
to_chat(user, "We lack the energy to evolve new abilities right now.")
return
geneticpoints -= thepower.dna_cost
@@ -38,16 +38,16 @@
//Reselect powers
/datum/changeling/proc/lingRespec(mob/user)
if(!ishuman(user))
user << "<span class='danger'>We can't remove our evolutions in this form!</span>"
to_chat(user, "<span class='danger'>We can't remove our evolutions in this form!</span>")
return
if(canrespec)
user << "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>"
to_chat(user, "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>")
user.remove_changeling_powers(1)
canrespec = 0
user.make_changeling()
return 1
else
user << "<span class='danger'>You lack the power to readapt your evolutions!</span>"
to_chat(user, "<span class='danger'>You lack the power to readapt your evolutions!</span>")
return 0
/mob/proc/make_changeling()
+16 -14
View File
@@ -12,14 +12,14 @@
var/datum/changeling/changeling = user.mind.changeling
if(changeling.isabsorbing)
user << "<span class='warning'>We are already absorbing!</span>"
to_chat(user, "<span class='warning'>We are already absorbing!</span>")
return
if(!user.pulling || !iscarbon(user.pulling))
user << "<span class='warning'>We must be grabbing a creature to absorb them!</span>"
to_chat(user, "<span class='warning'>We must be grabbing a creature to absorb them!</span>")
return
if(user.grab_state <= GRAB_NECK)
user << "<span class='warning'>We must have a tighter grip to absorb this creature!</span>"
to_chat(user, "<span class='warning'>We must have a tighter grip to absorb this creature!</span>")
return
var/mob/living/carbon/target = user.pulling
@@ -34,22 +34,22 @@
for(var/stage = 1, stage<=3, stage++)
switch(stage)
if(1)
user << "<span class='notice'>This creature is compatible. We must hold still...</span>"
to_chat(user, "<span class='notice'>This creature is compatible. We must hold still...</span>")
if(2)
user.visible_message("<span class='warning'>[user] extends a proboscis!</span>", "<span class='notice'>We extend a proboscis.</span>")
if(3)
user.visible_message("<span class='danger'>[user] stabs [target] with the proboscis!</span>", "<span class='notice'>We stab [target] with the proboscis.</span>")
target << "<span class='userdanger'>You feel a sharp stabbing pain!</span>"
to_chat(target, "<span class='userdanger'>You feel a sharp stabbing pain!</span>")
target.take_overall_damage(40)
feedback_add_details("changeling_powers","A[stage]")
if(!do_mob(user, target, 150))
user << "<span class='warning'>Our absorption of [target] has been interrupted!</span>"
to_chat(user, "<span class='warning'>Our absorption of [target] has been interrupted!</span>")
changeling.isabsorbing = 0
return
user.visible_message("<span class='danger'>[user] sucks the fluids from [target]!</span>", "<span class='notice'>We have absorbed [target].</span>")
target << "<span class='userdanger'>You are absorbed by the changeling!</span>"
to_chat(target, "<span class='userdanger'>You are absorbed by the changeling!</span>")
if(!changeling.has_dna(target.dna))
changeling.add_new_profile(target, user)
@@ -65,22 +65,24 @@
//Recent as opposed to all because rounds tend to have a LOT of text.
var/list/recent_speech = list()
if(target.say_log.len > LING_ABSORB_RECENT_SPEECH)
recent_speech = target.say_log.Copy(target.say_log.len-LING_ABSORB_RECENT_SPEECH+1,0) //0 so len-LING_ARS+1 to end of list
var/list/say_log = target.logging[INDIVIDUAL_SAY_LOG]
if(LAZYLEN(say_log) > LING_ABSORB_RECENT_SPEECH)
recent_speech = say_log.Copy(say_log.len-LING_ABSORB_RECENT_SPEECH+1,0) //0 so len-LING_ARS+1 to end of list
else
for(var/spoken_memory in target.say_log)
for(var/spoken_memory in say_log)
if(recent_speech.len >= LING_ABSORB_RECENT_SPEECH)
break
recent_speech[spoken_memory] = target.say_log[spoken_memory]
recent_speech[spoken_memory] = say_log[spoken_memory]
if(recent_speech.len)
user.mind.store_memory("<B>Some of [target]'s speech patterns, we should study these to better impersonate them!</B>")
user << "<span class='boldnotice'>Some of [target]'s speech patterns, we should study these to better impersonate them!</span>"
to_chat(user, "<span class='boldnotice'>Some of [target]'s speech patterns, we should study these to better impersonate them!</span>")
for(var/spoken_memory in recent_speech)
user.mind.store_memory("\"[recent_speech[spoken_memory]]\"")
user << "<span class='notice'>\"[recent_speech[spoken_memory]]\"</span>"
to_chat(user, "<span class='notice'>\"[recent_speech[spoken_memory]]\"</span>")
user.mind.store_memory("<B>We have no more knowledge of [target]'s speech patterns.</B>")
user << "<span class='boldnotice'>We have no more knowledge of [target]'s speech patterns.</span>"
to_chat(user, "<span class='boldnotice'>We have no more knowledge of [target]'s speech patterns.</span>")
if(target.mind.changeling)//If the target was a changeling, suck out their extra juice and objective points!
changeling.chem_charges += min(target.mind.changeling.chem_charges, changeling.chem_storage)
@@ -9,7 +9,7 @@
//Recover from stuns.
/obj/effect/proc_holder/changeling/adrenaline/sting_action(mob/living/user)
user << "<span class='notice'>Energy rushes through us.[user.lying ? " We arise." : ""]</span>"
to_chat(user, "<span class='notice'>Energy rushes through us.[user.lying ? " We arise." : ""]</span>")
user.SetSleeping(0)
user.SetParalysis(0)
user.SetStunned(0)
@@ -17,14 +17,14 @@
if(E.flash_protect)
E.sight_flags |= SEE_MOBS
E.flash_protect = -1
user << "We adjust our eyes to sense prey through walls."
to_chat(user, "We adjust our eyes to sense prey through walls.")
else
E.sight_flags -= SEE_MOBS
E.flash_protect = 2
user << "We adjust our eyes to protect them from bright lights."
to_chat(user, "We adjust our eyes to protect them from bright lights.")
user.update_sight()
else
user << "We can't adjust our eyes if we don't have any!"
to_chat(user, "We can't adjust our eyes if we don't have any!")
@@ -12,7 +12,7 @@
/obj/effect/proc_holder/changeling/biodegrade/sting_action(mob/living/carbon/human/user)
var/used = FALSE // only one form of shackles removed per use
if(!user.restrained() && istype(user.loc, /turf/open))
user << "<span class='warning'>We are already free!</span>"
to_chat(user, "<span class='warning'>We are already free!</span>")
return 0
if(user.handcuffed)
@@ -40,7 +40,7 @@
if(!istype(C))
return 0
C.visible_message("<span class='warning'>[C]'s hinges suddenly begin to melt and run!</span>")
user << "<span class='warning'>We vomit acidic goop onto the interior of [C]!</span>"
to_chat(user, "<span class='warning'>We vomit acidic goop onto the interior of [C]!</span>")
addtimer(CALLBACK(src, .proc/open_closet, user, C), 70)
used = TRUE
@@ -49,7 +49,7 @@
if(!istype(C))
return 0
C.visible_message("<span class='warning'>[src] shifts and starts to fall apart!</span>")
user << "<span class='warning'>We secrete acidic enzymes from our skin and begin melting our cocoon...</span>"
to_chat(user, "<span class='warning'>We secrete acidic enzymes from our skin and begin melting our cocoon...</span>")
addtimer(CALLBACK(src, .proc/dissolve_cocoon, user, C), 25) //Very short because it's just webs
used = TRUE
@@ -74,9 +74,9 @@
C.locked = FALSE
C.broken = TRUE
C.open()
user << "<span class='warning'>We open the container restraining us!</span>"
to_chat(user, "<span class='warning'>We open the container restraining us!</span>")
/obj/effect/proc_holder/changeling/biodegrade/proc/dissolve_cocoon(mob/living/carbon/human/user, obj/structure/spider/cocoon/C)
if(C && user.loc == C)
qdel(C) //The cocoon's destroy will move the changeling outside of it without interference
user << "<span class='warning'>We dissolve the cocoon!</span>"
to_chat(user, "<span class='warning'>We dissolve the cocoon!</span>")
@@ -8,11 +8,11 @@
/obj/effect/proc_holder/changeling/digitalcamo/sting_action(mob/user)
if(user.digitalcamo)
user << "<span class='notice'>We return to normal.</span>"
to_chat(user, "<span class='notice'>We return to normal.</span>")
user.digitalinvis = 0
user.digitalcamo = 0
else
user << "<span class='notice'>We distort our form to hide from the AI</span>"
to_chat(user, "<span class='notice'>We distort our form to hide from the AI</span>")
user.digitalcamo = 1
user.digitalinvis = 1
@@ -10,7 +10,7 @@
//Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay.
/obj/effect/proc_holder/changeling/fakedeath/sting_action(mob/living/user)
user << "<span class='notice'>We begin our stasis, preparing energy to arise once more.</span>"
to_chat(user, "<span class='notice'>We begin our stasis, preparing energy to arise once more.</span>")
if(user.stat != DEAD)
user.emote("deathgasp")
user.tod = worldtime2text()
@@ -25,12 +25,12 @@
/obj/effect/proc_holder/changeling/fakedeath/proc/ready_to_regenerate(mob/user)
if(user && user.mind && user.mind.changeling && user.mind.changeling.purchasedpowers)
user << "<span class='notice'>We are ready to revive.</span>"
to_chat(user, "<span class='notice'>We are ready to revive.</span>")
user.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/revive(null)
/obj/effect/proc_holder/changeling/fakedeath/can_sting(mob/user)
if(user.status_flags & FAKEDEATH)
user << "<span class='warning'>We are already reviving.</span>"
to_chat(user, "<span class='warning'>We are already reviving.</span>")
return
if(!user.stat) //Confirmation for living changelings if they want to fake their death
switch(alert("Are we sure we wish to fake our own death?",,"Yes", "No"))
@@ -21,7 +21,7 @@
/obj/effect/proc_holder/changeling/fleshmend/Destroy()
STOP_PROCESSING(SSobj, src)
..()
return ..()
/obj/effect/proc_holder/changeling/fleshmend/process()
if(recent_uses > 1)
@@ -30,10 +30,10 @@
//Starts healing you every second for 10 seconds.
//Can be used whilst unconscious.
/obj/effect/proc_holder/changeling/fleshmend/sting_action(mob/living/user)
user << "<span class='notice'>We begin to heal rapidly.</span>"
to_chat(user, "<span class='notice'>We begin to heal rapidly.</span>")
if(recent_uses > 1)
user << "<span class='warning'>Our healing's effectiveness is reduced \
by quick repeated use!</span>"
to_chat(user, "<span class='warning'>Our healing's effectiveness is reduced \
by quick repeated use!</span>")
recent_uses++
INVOKE_ASYNC(src, .proc/fleshmend, user)
@@ -7,6 +7,7 @@
req_human = 1
/obj/effect/proc_holder/changeling/headcrab/sting_action(mob/user)
set waitfor = FALSE
var/datum/mind/M = user.mind
var/list/organs = user.getorganszone("head", 1)
@@ -15,24 +16,24 @@
explosion(get_turf(user),0,0,2,0,silent=1)
for(var/mob/living/carbon/human/H in range(2,user))
H << "<span class='userdanger'>You are blinded by a shower of blood!</span>"
to_chat(H, "<span class='userdanger'>You are blinded by a shower of blood!</span>")
H.Stun(1)
H.blur_eyes(20)
H.adjust_eye_damage(5)
H.confused += 3
for(var/mob/living/silicon/S in range(2,user))
S << "<span class='userdanger'>Your sensors are disabled by a shower of blood!</span>"
to_chat(S, "<span class='userdanger'>Your sensors are disabled by a shower of blood!</span>")
S.Weaken(3)
var/turf = get_turf(user)
spawn(5) // So it's not killed in explosion
var/mob/living/simple_animal/hostile/headcrab/crab = new(turf)
for(var/obj/item/organ/I in organs)
I.loc = crab
crab.origin = M
if(crab.origin)
crab.origin.active = 1
crab.origin.transfer_to(crab)
crab << "<span class='warning'>You burst out of the remains of your former body in a shower of gore!</span>"
user.gib()
feedback_add_details("changeling_powers","LR")
return 1
. = TRUE
sleep(5) // So it's not killed in explosion
var/mob/living/simple_animal/hostile/headcrab/crab = new(turf)
for(var/obj/item/organ/I in organs)
I.loc = crab
crab.origin = M
if(crab.origin)
crab.origin.active = 1
crab.origin.transfer_to(crab)
to_chat(crab, "<span class='warning'>You burst out of the remains of your former body in a shower of gore!</span>")
@@ -10,7 +10,7 @@
..()
var/datum/changeling/changeling=user.mind.changeling
changeling.changeling_speak = 1
user << "<i><font color=#800080>Use say \":g message\" to communicate with the other changelings.</font></i>"
to_chat(user, "<i><font color=#800080>Use say \":g message\" to communicate with the other changelings.</font></i>")
var/obj/effect/proc_holder/changeling/hivemind_upload/S1 = new
if(!changeling.has_sting(S1))
changeling.purchasedpowers+=S1
@@ -36,7 +36,7 @@ var/list/datum/dna/hivemind_bank = list()
names += prof.name
if(names.len <= 0)
user << "<span class='notice'>The airwaves already have all of our DNA.</span>"
to_chat(user, "<span class='notice'>The airwaves already have all of our DNA.</span>")
return
var/chosen_name = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
@@ -50,7 +50,7 @@ var/list/datum/dna/hivemind_bank = list()
var/datum/changelingprofile/uploaded_dna = new chosen_dna.type
chosen_dna.copy_profile(uploaded_dna)
hivemind_bank += uploaded_dna
user << "<span class='notice'>We channel the DNA of [chosen_name] to the air.</span>"
to_chat(user, "<span class='notice'>We channel the DNA of [chosen_name] to the air.</span>")
feedback_add_details("changeling_powers","HU")
return 1
@@ -66,7 +66,7 @@ var/list/datum/dna/hivemind_bank = list()
var/datum/changeling/changeling = user.mind.changeling
var/datum/changelingprofile/first_prof = changeling.stored_profiles[1]
if(first_prof.name == user.real_name)//If our current DNA is the stalest, we gotta ditch it.
user << "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>"
to_chat(user, "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>")
return
return 1
@@ -78,7 +78,7 @@ var/list/datum/dna/hivemind_bank = list()
names[prof.name] = prof
if(names.len <= 0)
user << "<span class='notice'>There's no new DNA to absorb from the air.</span>"
to_chat(user, "<span class='notice'>There's no new DNA to absorb from the air.</span>")
return
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
@@ -91,6 +91,6 @@ var/list/datum/dna/hivemind_bank = list()
var/datum/changelingprofile/downloaded_prof = new chosen_prof.type
chosen_prof.copy_profile(downloaded_prof)
changeling.add_profile(downloaded_prof)
user << "<span class='notice'>We absorb the DNA of [S] from the air.</span>"
to_chat(user, "<span class='notice'>We absorb the DNA of [S] from the air.</span>")
feedback_add_details("changeling_powers","HD")
return 1
@@ -23,7 +23,7 @@
return
if(!user || user.notransform)
return 0
user << "<span class='notice'>We transform our appearance.</span>"
to_chat(user, "<span class='notice'>We transform our appearance.</span>")
changeling.purchasedpowers -= src
@@ -10,7 +10,7 @@
/obj/effect/proc_holder/changeling/lesserform/sting_action(mob/living/carbon/human/user)
if(!user || user.notransform)
return 0
user << "<span class='warning'>Our genes cry out!</span>"
to_chat(user, "<span class='warning'>Our genes cry out!</span>")
user.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE)
@@ -11,26 +11,26 @@
return
var/datum/changeling/changeling = user.mind.changeling
if(changeling.islinking)
user << "<span class='warning'>We have already formed a link with the victim!</span>"
to_chat(user, "<span class='warning'>We have already formed a link with the victim!</span>")
return
if(!user.pulling)
user << "<span class='warning'>We must be tightly grabbing a creature to link with them!</span>"
to_chat(user, "<span class='warning'>We must be tightly grabbing a creature to link with them!</span>")
return
if(!iscarbon(user.pulling))
user << "<span class='warning'>We cannot link with this creature!</span>"
to_chat(user, "<span class='warning'>We cannot link with this creature!</span>")
return
var/mob/living/carbon/target = user.pulling
if(!target.mind)
user << "<span class='warning'>The victim has no mind to link to!</span>"
to_chat(user, "<span class='warning'>The victim has no mind to link to!</span>")
return
if(target.stat == DEAD)
user << "<span class='warning'>The victim is dead, you cannot link to a dead mind!</span>"
to_chat(user, "<span class='warning'>The victim is dead, you cannot link to a dead mind!</span>")
return
if(target.mind.changeling)
user << "<span class='warning'>The victim is already a part of the hivemind!</span>"
to_chat(user, "<span class='warning'>The victim is already a part of the hivemind!</span>")
return
if(user.grab_state <= GRAB_AGGRESSIVE)
user << "<span class='warning'>We must have a tighter grip to link with this creature!</span>"
to_chat(user, "<span class='warning'>We must have a tighter grip to link with this creature!</span>")
return
return changeling.can_absorb_dna(user,target)
@@ -41,29 +41,29 @@
for(var/i in 1 to 3)
switch(i)
if(1)
user << "<span class='notice'>This creature is compatible. We must hold still...</span>"
to_chat(user, "<span class='notice'>This creature is compatible. We must hold still...</span>")
if(2)
user << "<span class='notice'>We stealthily stab [target] with a minor proboscis...</span>"
target << "<span class='userdanger'>You experience a stabbing sensation and your ears begin to ring...</span>"
to_chat(user, "<span class='notice'>We stealthily stab [target] with a minor proboscis...</span>")
to_chat(target, "<span class='userdanger'>You experience a stabbing sensation and your ears begin to ring...</span>")
if(3)
user << "<span class='notice'>We mold the [target]'s mind like clay, granting [target.p_them()] the ability to speak in the hivemind!</span>"
target << "<span class='userdanger'>A migraine throbs behind your eyes, you hear yourself screaming - but your mouth has not opened!</span>"
to_chat(user, "<span class='notice'>We mold the [target]'s mind like clay, granting [target.p_them()] the ability to speak in the hivemind!</span>")
to_chat(target, "<span class='userdanger'>A migraine throbs behind your eyes, you hear yourself screaming - but your mouth has not opened!</span>")
for(var/mob/M in mob_list)
if(M.lingcheck() == 2)
M << "<i><font color=#800080>We can sense a foreign presence in the hivemind...</font></i>"
to_chat(M, "<i><font color=#800080>We can sense a foreign presence in the hivemind...</font></i>")
target.mind.linglink = 1
target.say(":g AAAAARRRRGGGGGHHHHH!!")
target << "<font color=#800040><span class='boldannounce'>You can now communicate in the changeling hivemind, say \":g message\" to communicate!</span>"
to_chat(target, "<font color=#800040><span class='boldannounce'>You can now communicate in the changeling hivemind, say \":g message\" to communicate!</span>")
target.reagents.add_reagent("salbutamol", 40) // So they don't choke to death while you interrogate them
sleep(1800)
feedback_add_details("changeling_powers","A [i]")
if(!do_mob(user, target, 20))
user << "<span class='warning'>Our link with [target] has ended!</span>"
to_chat(user, "<span class='warning'>Our link with [target] has ended!</span>")
changeling.islinking = 0
target.mind.linglink = 0
return
changeling.islinking = 0
target.mind.linglink = 0
user << "<span class='notice'>You cannot sustain the connection any longer, your victim fades from the hivemind</span>"
target << "<span class='userdanger'>The link cannot be sustained any longer, your connection to the hivemind has faded!</span>"
to_chat(user, "<span class='notice'>You cannot sustain the connection any longer, your victim fades from the hivemind</span>")
to_chat(target, "<span class='userdanger'>The link cannot be sustained any longer, your connection to the hivemind has faded!</span>")
@@ -13,7 +13,7 @@
if(changeling.mimicing)
changeling.mimicing = ""
changeling.chem_recharge_slowdown -= 0.5
user << "<span class='notice'>We return our vocal glands to their original position.</span>"
to_chat(user, "<span class='notice'>We return our vocal glands to their original position.</span>")
return
var/mimic_voice = stripped_input(user, "Enter a name to mimic.", "Mimic Voice", null, MAX_NAME_LEN)
@@ -22,7 +22,7 @@
changeling.mimicing = mimic_voice
changeling.chem_recharge_slowdown += 0.5
user << "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will slow down regenerating chemicals while active.</span>"
user << "<span class='notice'>Use this power again to return to our original voice and return chemical production to normal levels.</span>"
to_chat(user, "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will slow down regenerating chemicals while active.</span>")
to_chat(user, "<span class='notice'>Use this power again to return to our original voice and return chemical production to normal levels.</span>")
feedback_add_details("changeling_powers","MV")
@@ -38,7 +38,7 @@
/obj/effect/proc_holder/changeling/weapon/sting_action(mob/living/user)
if(!user.drop_item())
user << "<span class='warning'>The [user.get_active_held_item()] is stuck to your hand, you cannot grow a [weapon_name_simple] over it!</span>"
to_chat(user, "<span class='warning'>The [user.get_active_held_item()] is stuck to your hand, you cannot grow a [weapon_name_simple] over it!</span>")
return
var/limb_regen = 0
if(user.active_hand_index % 2 == 0) //we regen the arm before changing it into the weapon
@@ -111,10 +111,10 @@
/obj/effect/proc_holder/changeling/suit/sting_action(mob/living/carbon/human/user)
if(!user.canUnEquip(user.wear_suit))
user << "\the [user.wear_suit] is stuck to your body, you cannot grow a [suit_name_simple] over it!"
to_chat(user, "\the [user.wear_suit] is stuck to your body, you cannot grow a [suit_name_simple] over it!")
return
if(!user.canUnEquip(user.head))
user << "\the [user.head] is stuck on your head, you cannot grow a [helmet_name_simple] over it!"
to_chat(user, "\the [user.head] is stuck on your head, you cannot grow a [helmet_name_simple] over it!")
return
user.dropItemToGround(user.head)
@@ -185,7 +185,7 @@
if(!A.requiresID() || A.allowed(user)) //This is to prevent stupid shit like hitting a door with an arm blade, the door opening because you have acces and still getting a "the airlocks motors resist our efforts to force it" message.
return
if(A.locked)
user << "<span class='warning'>The airlock's bolts prevent it from being forced!</span>"
to_chat(user, "<span class='warning'>The airlock's bolts prevent it from being forced!</span>")
return
if(A.hasPower())
@@ -245,11 +245,11 @@
if(!silent)
loc.visible_message("<span class='warning'>[loc.name]\'s arm starts stretching inhumanly!</span>", "<span class='warning'>Our arm twists and mutates, transforming it into a tentacle.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
else
loc << "<span class='notice'>You prepare to extend a tentacle.</span>"
to_chat(loc, "<span class='notice'>You prepare to extend a tentacle.</span>")
/obj/item/weapon/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj)
user << "<span class='warning'>The [name] is not ready yet.<span>"
to_chat(user, "<span class='warning'>The [name] is not ready yet.<span>")
/obj/item/ammo_casing/magic/tentacle
name = "tentacle"
@@ -264,9 +264,9 @@
gun = tentacle_gun
..()
/obj/item/ammo_casing/magic/tentacle/Destroy(obj/item/weapon/gun/magic/tentacle/tentacle_gun)
/obj/item/ammo_casing/magic/tentacle/Destroy()
gun = null
..()
return ..()
/obj/item/projectile/tentacle
name = "tentacle"
@@ -316,7 +316,7 @@
if(istype(target, /obj/item))
var/obj/item/I = target
if(!I.anchored)
firer << "<span class='notice'>You pull [I] towards yourself.</span>"
to_chat(firer, "<span class='notice'>You pull [I] towards yourself.</span>")
H.throw_mode_on()
I.throw_at(H, 10, 2)
. = 1
@@ -340,10 +340,10 @@
on_hit(I) //grab the item as if you had hit it directly with the tentacle
return 1
else
firer << "<span class='danger'>You can't seem to pry [I] off of [C]'s hands!<span>"
to_chat(firer, "<span class='danger'>You can't seem to pry [I] off of [C]'s hands!<span>")
return 0
else
firer << "<span class='danger'>[C] has nothing in hand to disarm!<span>"
to_chat(firer, "<span class='danger'>[C] has nothing in hand to disarm!<span>")
return 0
if(INTENT_GRAB)
@@ -8,7 +8,7 @@
//Heals the things that the other regenerative abilities don't.
/obj/effect/proc_holder/changeling/panacea/sting_action(mob/user)
user << "<span class='notice'>We cleanse impurities from our form.</span>"
to_chat(user, "<span class='notice'>We cleanse impurities from our form.</span>")
var/mob/living/simple_animal/borer/B = user.has_brain_worms()
if(B)
@@ -18,7 +18,7 @@
if(iscarbon(user))
var/mob/living/carbon/C = user
C.vomit(0)
user << "<span class='notice'>A parasite exits our form.</span>"
to_chat(user, "<span class='notice'>A parasite exits our form.</span>")
var/list/bad_organs = list(
user.getorgan(/obj/item/organ/body_egg),
user.getorgan(/obj/item/organ/zombie_infection))
@@ -11,8 +11,8 @@
always_keep = TRUE
/obj/effect/proc_holder/changeling/regenerate/sting_action(mob/living/user)
user << "<span class='notice'>You feel an itching, both inside and \
outside as your tissues knit and reknit.</span>"
to_chat(user, "<span class='notice'>You feel an itching, both inside and \
outside as your tissues knit and reknit.</span>")
if(iscarbon(user))
var/mob/living/carbon/C = user
var/list/missing = C.get_missing_limbs()
@@ -26,7 +26,7 @@
and tearing!</span>")
C.emote("scream")
C.regenerate_limbs(1)
C.regenerate_organs()
C.regenerate_organs()
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.restore_blood()
@@ -24,7 +24,7 @@
user.emote("scream")
user.regenerate_limbs(0, list("head"))
user.regenerate_organs()
user << "<span class='notice'>We have revived ourselves.</span>"
to_chat(user, "<span class='notice'>We have revived ourselves.</span>")
user.mind.changeling.purchasedpowers -= src
feedback_add_details("changeling_powers","CR")
return 1
@@ -14,12 +14,12 @@
/obj/effect/proc_holder/changeling/strained_muscles/sting_action(mob/living/carbon/user)
active = !active
if(active)
user << "<span class='notice'>Our muscles tense and strengthen.</span>"
to_chat(user, "<span class='notice'>Our muscles tense and strengthen.</span>")
else
user.status_flags &= ~GOTTAGOFAST
user << "<span class='notice'>Our muscles relax.</span>"
to_chat(user, "<span class='notice'>Our muscles relax.</span>")
if(stacks >= 10)
user << "<span class='danger'>We collapse in exhaustion.</span>"
to_chat(user, "<span class='danger'>We collapse in exhaustion.</span>")
user.Weaken(3)
user.emote("gasp")
@@ -27,7 +27,7 @@
user.status_flags |= GOTTAGOFAST
if(user.stat != CONSCIOUS || user.staminaloss >= 90)
active = !active
user << "<span class='notice'>Our muscles relax without the energy to strengthen them.</span>"
to_chat(user, "<span class='notice'>Our muscles relax without the energy to strengthen them.</span>")
user.Weaken(2)
user.status_flags &= ~GOTTAGOFAST
break
@@ -37,7 +37,7 @@
user.staminaloss += stacks * 1.3 //At first the changeling may regenerate stamina fast enough to nullify fatigue, but it will stack
if(stacks == 11) //Warning message that the stacks are getting too high
user << "<span class='warning'>Our legs are really starting to hurt...</span>"
to_chat(user, "<span class='warning'>Our legs are really starting to hurt...</span>")
sleep(40)
@@ -14,13 +14,13 @@
return
/obj/effect/proc_holder/changeling/sting/proc/set_sting(mob/user)
user << "<span class='notice'>We prepare our sting, use alt+click or middle mouse button on target to sting them.</span>"
to_chat(user, "<span class='notice'>We prepare our sting, use alt+click or middle mouse button on target to sting them.</span>")
user.mind.changeling.chosen_sting = src
user.hud_used.lingstingdisplay.icon_state = sting_icon
user.hud_used.lingstingdisplay.invisibility = 0
/obj/effect/proc_holder/changeling/sting/proc/unset_sting(mob/user)
user << "<span class='warning'>We retract our sting, we can't sting anyone for now.</span>"
to_chat(user, "<span class='warning'>We retract our sting, we can't sting anyone for now.</span>")
user.mind.changeling.chosen_sting = null
user.hud_used.lingstingdisplay.icon_state = null
user.hud_used.lingstingdisplay.invisibility = INVISIBILITY_ABSTRACT
@@ -33,7 +33,7 @@
if(!..())
return
if(!user.mind.changeling.chosen_sting)
user << "We haven't prepared our sting yet!"
to_chat(user, "We haven't prepared our sting yet!")
if(!iscarbon(target))
return
if(!isturf(user.loc))
@@ -49,9 +49,9 @@
/obj/effect/proc_holder/changeling/sting/sting_feedback(mob/user, mob/target)
if(!target)
return
user << "<span class='notice'>We stealthily sting [target.name].</span>"
to_chat(user, "<span class='notice'>We stealthily sting [target.name].</span>")
if(target.mind && target.mind.changeling)
target << "<span class='warning'>You feel a tiny prick.</span>"
to_chat(target, "<span class='warning'>You feel a tiny prick.</span>")
return 1
@@ -75,7 +75,7 @@
if(!selected_dna)
return
if(NOTRANSSTING in selected_dna.dna.species.species_traits)
user << "<span class = 'notice'>That DNA is not compatible with changeling retrovirus!"
to_chat(user, "<span class = 'notice'>That DNA is not compatible with changeling retrovirus!")
return
..()
@@ -83,30 +83,32 @@
if(!..())
return
if((target.disabilities & HUSK) || !target.has_dna())
user << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
to_chat(user, "<span class='warning'>Our sting appears ineffective against its DNA.</span>")
return 0
return 1
/obj/effect/proc_holder/changeling/sting/transformation/sting_action(mob/user, mob/target)
set waitfor = FALSE
add_logs(user, target, "stung", "transformation sting", " new identity is [selected_dna.dna.real_name]")
var/datum/dna/NewDNA = selected_dna.dna
if(ismonkey(target))
user << "<span class='notice'>Our genes cry out as we sting [target.name]!</span>"
to_chat(user, "<span class='notice'>Our genes cry out as we sting [target.name]!</span>")
if(iscarbon(target))
var/mob/living/carbon/C = target
var/mob/living/carbon/C = target
if(istype(C))
if(C.status_flags & CANWEAKEN)
C.do_jitter_animation(500)
C.take_bodypart_damage(20, 0) //The process is extremely painful
target.visible_message("<span class='danger'>[target] begins to violenty convulse!</span>","<span class='userdanger'>You feel a tiny prick and a begin to uncontrollably convulse!</span>")
spawn(10)
C.real_name = NewDNA.real_name
NewDNA.transfer_identity(C, transfer_SE=1)
C.updateappearance(mutcolor_update=1)
C.domutcheck()
feedback_add_details("changeling_powers","TS")
return 1
. = TRUE
if(istype(C))
sleep(10)
C.real_name = NewDNA.real_name
NewDNA.transfer_identity(C, transfer_SE=1)
C.updateappearance(mutcolor_update=1)
C.domutcheck()
/obj/effect/proc_holder/changeling/sting/false_armblade
@@ -130,7 +132,7 @@
if(!..())
return
if((target.disabilities & HUSK) || !target.has_dna())
user << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
to_chat(user, "<span class='warning'>Our sting appears ineffective against its DNA.</span>")
return 0
return 1
@@ -138,11 +140,11 @@
add_logs(user, target, "stung", object="falso armblade sting")
if(!target.drop_item())
user << "<span class='warning'>The [target.get_active_held_item()] is stuck to their hand, you cannot grow a false armblade over it!</span>"
to_chat(user, "<span class='warning'>The [target.get_active_held_item()] is stuck to their hand, you cannot grow a false armblade over it!</span>")
return
if(ismonkey(target))
user << "<span class='notice'>Our genes cry out as we sting [target.name]!</span>"
to_chat(user, "<span class='notice'>Our genes cry out as we sting [target.name]!</span>")
var/obj/item/weapon/melee/arm_blade/false/blade = new(target,1)
target.put_in_hands(blade)
@@ -207,7 +209,7 @@
/obj/effect/proc_holder/changeling/sting/blind/sting_action(mob/user, mob/living/carbon/target)
add_logs(user, target, "stung", "blind sting")
target << "<span class='danger'>Your eyes burn horrifically!</span>"
to_chat(target, "<span class='danger'>Your eyes burn horrifically!</span>")
target.become_nearsighted()
target.blind_eyes(20)
target.blur_eyes(40)
@@ -11,36 +11,93 @@
name = "flesh"
flags = NODROP
/obj/item/clothing/glasses/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.changeling)
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
qdel(src)
return
..()
/obj/item/clothing/under/changeling
name = "flesh"
flags = NODROP
/obj/item/clothing/under/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.changeling)
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
qdel(src)
return
..()
/obj/item/clothing/suit/changeling
name = "flesh"
flags = NODROP
allowed = list(/obj/item/changeling)
/obj/item/clothing/suit/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.changeling)
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
qdel(src)
return
..()
/obj/item/clothing/head/changeling
name = "flesh"
flags = NODROP
/obj/item/clothing/head/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.changeling)
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
qdel(src)
return
..()
/obj/item/clothing/shoes/changeling
name = "flesh"
flags = NODROP
/obj/item/clothing/shoes/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.changeling)
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
qdel(src)
return
..()
/obj/item/clothing/gloves/changeling
name = "flesh"
flags = NODROP
/obj/item/clothing/gloves/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.changeling)
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
qdel(src)
return
..()
/obj/item/clothing/mask/changeling
name = "flesh"
flags = NODROP
/obj/item/clothing/mask/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.changeling)
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
qdel(src)
return
..()
/obj/item/changeling
name = "flesh"
flags = NODROP
slot_flags = ALL
allowed = list(/obj/item/changeling)
/obj/item/changeling/attack_hand(mob/user)
if(loc == user && user.mind && user.mind.changeling)
to_chat(user, "<span class='notice'>You reabsorb [src] into your body.</span>")
qdel(src)
return
..()
//Change our DNA to that of somebody we've absorbed.
/obj/effect/proc_holder/changeling/transform/sting_action(mob/living/carbon/human/user)
var/datum/changeling/changeling = user.mind.changeling
@@ -62,7 +119,7 @@
var/chosen_name = input(prompt, title, null) as null|anything in names
if(!chosen_name)
return
if(chosen_name == "Drop Flesh Disguise")
for(var/slot in slots)
if(istype(user.vars[slot], slot2type[slot]))
@@ -12,8 +12,8 @@
var/const/changeling_amount = 1 //hard limit on changelings if scaling is turned off
/datum/game_mode/traitor/changeling/announce()
world << "<B>The current game mode is - Traitor+Changeling!</B>"
world << "<B>There are alien creatures on the station along with some syndicate operatives out for their own gain! Do not let the changelings or the traitors succeed!</B>"
to_chat(world, "<B>The current game mode is - Traitor+Changeling!</B>")
to_chat(world, "<B>There are alien creatures on the station along with some syndicate operatives out for their own gain! Do not let the changelings or the traitors succeed!</B>")
/datum/game_mode/traitor/changeling/can_start()
if(!..())
+8 -8
View File
@@ -91,7 +91,7 @@ Credit where due:
name = "clockwork cult"
config_tag = "clockwork_cult"
antag_flag = ROLE_SERVANT_OF_RATVAR
required_players = 10
required_players = 24
required_enemies = 3
recommended_enemies = 3
enemy_minimum_age = 14
@@ -153,7 +153,7 @@ Credit where due:
var/greeting_text = "<br><b><span class='large_brass'>You are a servant of Ratvar, the Clockwork Justiciar.</span>\n\
Rusting eternally in the Celestial Derelict, Ratvar has formed a covenant of mortals, with you as one of its members. As one of the Justiciar's servants, you are to work to the best of your \
ability to assist in completion of His agenda. You may not know the specifics of how to do so, but luckily you have a vessel to help you learn.</b>"
M << greeting_text
to_chat(M, greeting_text)
return 1
/datum/game_mode/proc/equip_servant(mob/living/L) //Grants a clockwork slab to the mob, with one of each component
@@ -171,10 +171,10 @@ Credit where due:
if(!S.forceMove(get_turf(L)))
qdel(S)
if(S && !QDELETED(S))
L << "<b>[slot] is a link to the halls of Reebe and your master. You may use it to perform many tasks, but also become oriented with the workings of Ratvar and how to best complete your \
to_chat(L, "<b>[slot] is a link to the halls of Reebe and your master. You may use it to perform many tasks, but also become oriented with the workings of Ratvar and how to best complete your \
tasks. This clockwork slab will be instrumental in your triumph. Remember: you can speak discreetly with your fellow servants by using the <span class='brass'>Hierophant Network</span> action button, \
and you can find a concise tutorial by using the slab in-hand and selecting Recollection.</b>"
L << "<i>Alternatively, check out the wiki page at </i><b>https://tgstation13.org/wiki/Clockwork_Cult</b><i>, which contains additional information.</i>"
and you can find a concise tutorial by using the slab in-hand and selecting Recollection.</b>")
to_chat(L, "<i>Alternatively, check out the wiki page at </i><b>https://tgstation13.org/wiki/Clockwork_Cult</b><i>, which contains additional information.</i>")
return TRUE
return FALSE
@@ -182,7 +182,7 @@ Credit where due:
if(!L || !istype(L) || !L.mind)
return 0
var/datum/mind/M = L.mind
M.current << "<b>This is Ratvar's will:</b> [clockwork_explanation]"
to_chat(M.current, "<b>This is Ratvar's will:</b> [clockwork_explanation]")
M.memory += "<b>Ratvar's will:</b> [clockwork_explanation]<br>"
return 1
@@ -218,7 +218,7 @@ Credit where due:
if(half_victory)
text += "<span class='large_brass'><b>The crew escaped before [clockwork_objective == CLOCKCULT_GATEWAY ? "Ratvar could rise":"the station could be proselytized"], but the gateway \
was successfully constructed!</b></span>"
feedback_set_details("round_end_result", "halfwin - round ended before the gateway finished")
feedback_set_details("round_end_result", "halfwin - servants constructed the gateway but their objective was not completed ([clockwork_objective])")
else
text += "<span class='userdanger'>Ratvar's servants have failed!</span>"
feedback_set_details("round_end_result", "loss - servants failed their objective ([clockwork_objective])")
@@ -233,7 +233,7 @@ Credit where due:
text += "<br><b>Ratvar's servants were:</b>"
for(var/datum/mind/M in servants_of_ratvar)
text += printplayer(M)
world << text
to_chat(world, text)
/datum/game_mode/proc/update_servant_icons_added(datum/mind/M)
var/datum/atom_hud/antag/A = huds[ANTAG_HUD_CLOCKWORK]
@@ -64,7 +64,7 @@
if(!is_servant_of_ratvar(M) && M != L)
M.flash_act()
if(iscultist(L))
L << "<span class='heavy_brass'>\"Watch your step, wretch.\"</span>"
to_chat(L, "<span class='heavy_brass'>\"Watch your step, wretch.\"</span>")
L.adjustBruteLoss(10)
L.Weaken(7)
L.visible_message("<span class='warning'>[src] appears around [L] in a burst of light!</span>", \
@@ -83,18 +83,19 @@
layer = LOW_SIGIL_LAYER
alpha = 125
color = "#FAE48C"
light_range = 2 //soft light
light_power = 0.9
light_color = "#FAE48C"
stat_affected = UNCONSCIOUS
resist_string = "glows faintly yellow"
var/convert_time = 70
var/glow_light = 2 //soft light
var/glow_falloff = 1
var/delete_on_finish = TRUE
sigil_name = "Sigil of Submission"
var/glow_type
/obj/effect/clockwork/sigil/submission/New()
..()
SetLuminosity(glow_light,glow_falloff)
update_light()
/obj/effect/clockwork/sigil/submission/proc/post_channel(mob/living/L)
@@ -119,7 +120,7 @@
return
post_channel(L)
if(is_eligible_servant(L))
L << "<span class='heavy_brass'>\"You belong to me now.\"</span>"
to_chat(L, "<span class='heavy_brass'>\"You belong to me now.\"</span>")
add_servant_of_ratvar(L)
L.Weaken(3) //Completely defenseless for about five seconds - mainly to give them time to read over the information they've just been presented with
L.Stun(3)
@@ -130,12 +131,12 @@
for(var/M in mob_list)
if(isobserver(M))
var/link = FOLLOW_LINK(M, L)
M << "[link] <span class='heavy_brass'>[message] [L.real_name]!</span>"
to_chat(M, "[link] <span class='heavy_brass'>[message] [L.real_name]!</span>")
else if(is_servant_of_ratvar(M))
if(M == L)
M << "<span class='heavy_brass'>[message] you!</span>"
to_chat(M, "<span class='heavy_brass'>[message] you!</span>")
else
M << "<span class='heavy_brass'>[message] [L.real_name]!</span>"
to_chat(M, "<span class='heavy_brass'>[message] [L.real_name]!</span>")
if(delete_on_finish)
qdel(src)
else
@@ -153,8 +154,9 @@
icon_state = "sigiltransgression"
alpha = 200
color = "#A97F1B"
glow_light = 4 //bright light
glow_falloff = 3
light_range = 3 //bright light
light_power = 1
light_color = "#A97F1B"
delete_on_finish = FALSE
sigil_name = "Sigil of Accession"
glow_type = /obj/effect/overlay/temp/ratvar/sigil/accession
@@ -177,6 +179,7 @@
icon_state = "sigiltransmission"
alpha = 50
color = "#EC8A2D"
light_color = "#EC8A2D"
resist_string = "glows faintly"
sigil_name = "Sigil of Transmission"
affects_servants = TRUE
@@ -195,22 +198,22 @@
var/structure_number = 0
for(var/obj/structure/destructible/clockwork/powered/P in range(SIGIL_ACCESS_RANGE, src))
structure_number++
user << "<span class='[power_charge ? "brass":"alloy"]'>It is storing <b>[ratvar_awakens ? "INFINITY":"[power_charge]"]W</b> of power, \
and <b>[structure_number]</b> Clockwork Structure[structure_number == 1 ? "":"s"] [structure_number == 1 ? "is":"are"] in range.</span>"
to_chat(user, "<span class='[power_charge ? "brass":"alloy"]'>It is storing <b>[ratvar_awakens ? "INFINITY":"[power_charge]"]W</b> of power, \
and <b>[structure_number]</b> Clockwork Structure[structure_number == 1 ? "":"s"] [structure_number == 1 ? "is":"are"] in range.</span>")
if(iscyborg(user))
user << "<span class='brass'>You can recharge from the [sigil_name] by crossing it.</span>"
to_chat(user, "<span class='brass'>You can recharge from the [sigil_name] by crossing it.</span>")
/obj/effect/clockwork/sigil/transmission/sigil_effects(mob/living/L)
if(is_servant_of_ratvar(L))
if(iscyborg(L))
charge_cyborg(L)
else if(power_charge)
L << "<span class='brass'>You feel a slight, static shock.</span>"
to_chat(L, "<span class='brass'>You feel a slight, static shock.</span>")
/obj/effect/clockwork/sigil/transmission/proc/charge_cyborg(mob/living/silicon/robot/cyborg)
if(!cyborg_checks(cyborg))
return
cyborg << "<span class='brass'>You start to charge from the [sigil_name]...</span>"
to_chat(cyborg, "<span class='brass'>You start to charge from the [sigil_name]...</span>")
if(!do_after(cyborg, 50, target = src))
return
if(!cyborg_checks(cyborg))
@@ -227,16 +230,16 @@
/obj/effect/clockwork/sigil/transmission/proc/cyborg_checks(mob/living/silicon/robot/cyborg)
if(!cyborg.cell)
cyborg << "<span class='warning'>You have no cell!</span>"
to_chat(cyborg, "<span class='warning'>You have no cell!</span>")
return FALSE
if(!power_charge)
cyborg << "<span class='warning'>The [sigil_name] has no stored power!</span>"
to_chat(cyborg, "<span class='warning'>The [sigil_name] has no stored power!</span>")
return FALSE
if(cyborg.cell.charge > cyborg.cell.maxcharge - MIN_CLOCKCULT_POWER)
cyborg << "<span class='warning'>You are already at maximum charge!</span>"
to_chat(cyborg, "<span class='warning'>You are already at maximum charge!</span>")
return FALSE
if(cyborg.has_status_effect(STATUS_EFFECT_POWERREGEN))
cyborg << "<span class='warning'>You are already regenerating power!</span>"
to_chat(cyborg, "<span class='warning'>You are already regenerating power!</span>")
return FALSE
return TRUE
@@ -260,10 +263,9 @@
else
alpha = min(initial(alpha) + power_charge*0.02, 255)
if(!power_charge)
SetLuminosity(0)
set_light(0)
else
SetLuminosity(round(alpha*0.03, 1), round(alpha*0.02, 1))
set_light(round(alpha*0.02, 1), round(alpha*0.005, 1))
//Vitality Matrix: Drains health from non-servants to heal or even revive servants.
/obj/effect/clockwork/sigil/vitality
@@ -287,11 +289,11 @@
/obj/effect/clockwork/sigil/vitality/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
user << "<span class='[vitality ? "inathneq_small":"alloy"]'>It has access to <b>[ratvar_awakens ? "INFINITE":"[vitality]"]</b> units of vitality.</span>"
to_chat(user, "<span class='[vitality ? "inathneq_small":"alloy"]'>It has access to <b>[ratvar_awakens ? "INFINITE":"[vitality]"]</b> units of vitality.</span>")
if(ratvar_awakens)
user << "<span class='inathneq_small'>It can revive Servants at no cost!</span>"
to_chat(user, "<span class='inathneq_small'>It can revive Servants at no cost!</span>")
else
user << "<span class='inathneq_small'>It can revive Servants at a cost of <b>[base_revive_cost]</b> vitality plus vitality equal to the non-oxygen damage they have, in addition to being destroyed in the process.</span>"
to_chat(user, "<span class='inathneq_small'>It can revive Servants at a cost of <b>[base_revive_cost]</b> vitality plus vitality equal to the non-oxygen damage they have, in addition to being destroyed in the process.</span>")
/obj/effect/clockwork/sigil/vitality/sigil_effects(mob/living/L)
if((is_servant_of_ratvar(L) && L.suiciding) || sigil_active)
@@ -315,7 +317,7 @@
animate(V, alpha = 0, transform = matrix()*2, time = 8)
playsound(L, 'sound/magic/WandODeath.ogg', 50, 1)
L.visible_message("<span class='warning'>[L] collapses in on [L.p_them()]self as [src] flares bright blue!</span>")
L << "<span class='inathneq_large'>\"[text2ratvar("Your life will not be wasted.")]\"</span>"
to_chat(L, "<span class='inathneq_large'>\"[text2ratvar("Your life will not be wasted.")]\"</span>")
for(var/obj/item/W in L)
if(!L.dropItemToGround(W))
qdel(W)
@@ -5,7 +5,9 @@
clockwork_desc = "A gateway in reality."
icon_state = "spatial_gateway"
density = 1
luminosity = 2
light_range = 2
light_power = 3
light_color = "#6A4D2F"
var/sender = TRUE //If this gateway is made for sending, not receiving
var/both_ways = FALSE
var/lifetime = 25 //How many deciseconds this portal will last
@@ -15,6 +17,7 @@
/obj/effect/clockwork/spatial_gateway/New()
..()
update_light()
addtimer(CALLBACK(src, .proc/check_setup), 1)
/obj/effect/clockwork/spatial_gateway/Destroy()
@@ -53,7 +56,7 @@
/obj/effect/clockwork/spatial_gateway/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
user << "<span class='brass'>It has [uses] uses remaining.</span>"
to_chat(user, "<span class='brass'>It has [uses] uses remaining.</span>")
/obj/effect/clockwork/spatial_gateway/attack_ghost(mob/user)
if(linked_gateway)
@@ -84,7 +87,7 @@
qdel(src)
return TRUE
if(istype(I, /obj/item/clockwork/slab))
user << "<span class='heavy_brass'>\"I don't think you want to drop your slab into that.\"\n\"If you really want to, try throwing it.\"</span>"
to_chat(user, "<span class='heavy_brass'>\"I don't think you want to drop your slab into that.\"\n\"If you really want to, try throwing it.\"</span>")
return TRUE
if(user.drop_item() && uses)
user.visible_message("<span class='warning'>[user] drops [I] into [src]!</span>", "<span class='danger'>You drop [I] into [src]!</span>")
@@ -123,7 +126,7 @@
return FALSE
if(isliving(A))
var/mob/living/user = A
user << "<span class='warning'><b>You pass through [src] and appear elsewhere!</b></span>"
to_chat(user, "<span class='warning'><b>You pass through [src] and appear elsewhere!</b></span>")
linked_gateway.visible_message("<span class='warning'>A shape appears in [linked_gateway] before emerging!</span>")
playsound(src, 'sound/effects/EMPulse.ogg', 50, 1)
playsound(linked_gateway, 'sound/effects/EMPulse.ogg', 50, 1)
@@ -159,31 +162,31 @@
possible_targets[avoid_assoc_duplicate_keys("[L.name] ([L.real_name])", teleportnames)] = L
if(!possible_targets.len)
invoker << "<span class='warning'>There are no other eligible targets for a Spatial Gateway!</span>"
to_chat(invoker, "<span class='warning'>There are no other eligible targets for a Spatial Gateway!</span>")
return FALSE
var/input_target_key = input(invoker, "Choose a target to form a rift to.", "Spatial Gateway") as null|anything in possible_targets
var/atom/movable/target = possible_targets[input_target_key]
if(!src || !input_target_key || !invoker || !invoker.canUseTopic(src, !issilicon(invoker)) || !is_servant_of_ratvar(invoker) || (istype(src, /obj/item) && invoker.get_active_held_item() != src) || !invoker.can_speak_vocal())
return FALSE //if any of the involved things no longer exist, the invoker is stunned, too far away to use the object, or does not serve ratvar, or if the object is an item and not in the mob's active hand, fail
if(!target) //if we have no target, but did have a key, let them retry
invoker << "<span class='warning'>That target no longer exists!</span>"
to_chat(invoker, "<span class='warning'>That target no longer exists!</span>")
return procure_gateway(invoker, time_duration, gateway_uses, two_way)
if(isliving(target))
var/mob/living/L = target
if(!is_servant_of_ratvar(L))
invoker << "<span class='warning'>That target is no longer a Servant!</span>"
to_chat(invoker, "<span class='warning'>That target is no longer a Servant!</span>")
return procure_gateway(invoker, time_duration, gateway_uses, two_way)
if(L.stat != CONSCIOUS)
invoker << "<span class='warning'>That Servant is no longer conscious!</span>"
to_chat(invoker, "<span class='warning'>That Servant is no longer conscious!</span>")
return procure_gateway(invoker, time_duration, gateway_uses, two_way)
var/istargetobelisk = istype(target, /obj/structure/destructible/clockwork/powered/clockwork_obelisk)
var/issrcobelisk = istype(src, /obj/structure/destructible/clockwork/powered/clockwork_obelisk)
if(issrcobelisk && !anchored)
invoker << "<span class='warning'>[src] is no longer secured!</span>"
to_chat(invoker, "<span class='warning'>[src] is no longer secured!</span>")
return FALSE
if(istargetobelisk)
if(!target.anchored)
invoker << "<span class='warning'>That [target.name] is no longer secured!</span>"
to_chat(invoker, "<span class='warning'>That [target.name] is no longer secured!</span>")
return procure_gateway(invoker, time_duration, gateway_uses, two_way)
var/obj/structure/destructible/clockwork/powered/clockwork_obelisk/CO = target
var/efficiency = CO.get_efficiency_mod()
@@ -45,7 +45,7 @@
. = min(cell.charge, 250)
cell.use(.)
if(prob(20))
src << "<span class='userdanger'>ERROR: Power loss detected!</span>"
to_chat(src, "<span class='userdanger'>ERROR: Power loss detected!</span>")
spark_system.start()
/obj/mecha/power_drain(clockcult_user)
@@ -6,11 +6,11 @@
if(!servantsonly && isobserver(M))
if(target)
var/link = FOLLOW_LINK(M, target)
M << "[link] [message]"
to_chat(M, "[link] [message]")
else
M << message
to_chat(M, message)
else if(is_servant_of_ratvar(M))
M << message
to_chat(M, message)
return TRUE
//Sends a titled message from a mob to all servants of ratvar and ghosts.
@@ -50,9 +50,12 @@
if(locate(/obj/structure/table) in src)
return FALSE
if(is_blocked_turf(src, TRUE))
user << "<span class='warning'>Something is in the way, preventing you from proselytizing [src] into a clockwork wall.</span>"
to_chat(user, "<span class='warning'>Something is in the way, preventing you from proselytizing [src] into a clockwork wall.</span>")
return TRUE
return list("operation_time" = 100, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_MINUS_FLOOR, "spawn_dir" = SOUTH)
var/operation_time = 100
if(proselytizer.speed_multiplier > 0)
operation_time /= proselytizer.speed_multiplier
return list("operation_time" = operation_time, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_MINUS_FLOOR, "spawn_dir" = SOUTH)
//False wall conversion
/obj/structure/falsewall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
@@ -80,7 +83,7 @@
if(proselytizer.metal_to_power)
var/no_delete = FALSE
if(amount_temp < 2)
user << "<span class='warning'>You need at least <b>2</b> floor tiles to convert into power.</span>"
to_chat(user, "<span class='warning'>You need at least <b>2</b> floor tiles to convert into power.</span>")
return TRUE
if(IsOdd(amount_temp))
amount_temp--
@@ -98,7 +101,7 @@
new /obj/item/stack/tile/brass(get_turf(src), sheets_to_make)
use(used)
else
user << "<span class='warning'>You need at least <b>20</b> floor tiles to convert into brass.</span>"
to_chat(user, "<span class='warning'>You need at least <b>20</b> floor tiles to convert into brass.</span>")
return TRUE
/obj/item/stack/rods/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
@@ -116,7 +119,7 @@
new /obj/item/stack/tile/brass(get_turf(src), sheets_to_make)
use(used)
else
user << "<span class='warning'>You need at least <b>10</b> rods to convert into brass.</span>"
to_chat(user, "<span class='warning'>You need at least <b>10</b> rods to convert into brass.</span>")
return TRUE
/obj/item/stack/sheet/metal/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
@@ -134,7 +137,7 @@
new /obj/item/stack/tile/brass(get_turf(src), sheets_to_make)
use(used)
else
user << "<span class='warning'>You need at least <b>5</b> sheets of metal to convert into brass.</span>"
to_chat(user, "<span class='warning'>You need at least <b>5</b> sheets of metal to convert into brass.</span>")
return TRUE
/obj/item/stack/sheet/plasteel/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
@@ -152,7 +155,7 @@
new /obj/item/stack/tile/brass(get_turf(src), sheets_to_make)
use(used)
else
user << "<span class='warning'>You need at least <b>2</b> sheets of plasteel to convert into brass.</span>"
to_chat(user, "<span class='warning'>You need at least <b>2</b> sheets of plasteel to convert into brass.</span>")
return TRUE
//Brass directly to power
@@ -314,14 +317,18 @@
//Hitting a ratvar'd silicon will also try to repair it.
/mob/living/silicon/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
. = TRUE
if(proselytizer_heal(user, proselytizer) && user)
if(health == maxHealth) //if we're at maximum health, prosel the turf under us
return FALSE
else if(proselytizer_heal(user, proselytizer) && user)
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.</span>", \
"<span class='alloy'>You finish repairin[src == user ? "g yourself. You are":"g [src]. [p_they(TRUE)] [p_are()]"] now at <b>[abs(HEALTH_THRESHOLD_DEAD - health)]/[abs(HEALTH_THRESHOLD_DEAD - maxHealth)]</b> health.</span>")
//Same with clockwork mobs.
/mob/living/simple_animal/hostile/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
. = TRUE
if(proselytizer_heal(user, proselytizer) && user)
if(health == maxHealth) //if we're at maximum health, prosel the turf under us
return FALSE
else if(proselytizer_heal(user, proselytizer) && user)
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.</span>", \
"<span class='alloy'>You finish repairin[src == user ? "g yourself. You are":"g [src]. [p_they(TRUE)] [p_are()]"] now at <b>[health]/[maxHealth]</b> health.</span>")
@@ -329,20 +336,20 @@
/mob/living/simple_animal/drone/cogscarab/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
. = TRUE
if(stat == DEAD)
try_reactivate(user)
try_reactivate(user) //if we're at maximum health, prosel the turf under us
return
if(health < maxHealth && !(flags & GODMODE))
if(health == maxHealth)
return FALSE
else if(!(flags & GODMODE))
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...</span>", \
"<span class='alloy'>You start repairin[src == user ? "g yourself" : "g [src]"]...</span>")
proselytizer.repairing = src
if(do_after(user,80*proselytizer.speed_multiplier, target=src))
if(do_after(user, (maxHealth - health)*2, target=src))
adjustHealth(-maxHealth)
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.</span>", \
"<span class='alloy'>You finish repairin[src == user ? "g yourself" : "g [src]"].</span>")
if(proselytizer)
proselytizer.repairing = null
else
user << "<span class='warning'>[src == user ? "You" : "[src]"] [src == user ? "are" : "is"] at maximum health!</span>"
//Convert shards and gear bits directly to power
/obj/item/clockwork/alloy_shards/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
@@ -46,14 +46,14 @@
else
var/mob/living/L = target
if(L.null_rod_check())
ranged_ability_user << "<span class='sevtug'>\"A void weapon? Really, you expect me to be able to do anything?\"</span>"
to_chat(ranged_ability_user, "<span class='sevtug'>\"A void weapon? Really, you expect me to be able to do anything?\"</span>")
return TRUE
if(is_servant_of_ratvar(L))
if(L != ranged_ability_user)
ranged_ability_user << "<span class='sevtug'>\"[L.p_they(TRUE)] already serve[L.p_s()] Ratvar. [text2ratvar("Perhaps [ranged_ability_user.p_theyre()] into bondage?")]\"</span>"
to_chat(ranged_ability_user, "<span class='sevtug'>\"[L.p_they(TRUE)] already serve[L.p_s()] Ratvar. [text2ratvar("Perhaps [ranged_ability_user.p_theyre()] into bondage?")]\"</span>")
return TRUE
if(L.stat == DEAD)
ranged_ability_user << "<span class='sevtug'>\"[L.p_theyre(TRUE)] dead, idiot.\"</span>"
to_chat(ranged_ability_user, "<span class='sevtug'>\"[L.p_theyre(TRUE)] dead, idiot.\"</span>")
return TRUE
if(istype(L.buckled, /obj/structure/destructible/clockwork/geis_binding)) //if they're already bound, just stun them
@@ -100,10 +100,10 @@
if(isliving(target) && (target in view(7, get_turf(ranged_ability_user))))
var/mob/living/L = target
if(!is_servant_of_ratvar(L))
ranged_ability_user << "<span class='inathneq'>\"[L] does not yet serve Ratvar.\"</span>"
to_chat(ranged_ability_user, "<span class='inathneq'>\"[L] does not yet serve Ratvar.\"</span>")
return TRUE
if(L.stat == DEAD)
ranged_ability_user << "<span class='inathneq'>\"[L.p_they(TRUE)] [L.p_are()] dead. [text2ratvar("Oh, child. To have your life cut short...")]\"</span>"
to_chat(ranged_ability_user, "<span class='inathneq'>\"[L.p_they(TRUE)] [L.p_are()] dead. [text2ratvar("Oh, child. To have your life cut short...")]\"</span>")
return TRUE
var/brutedamage = L.getBruteLoss()
@@ -111,7 +111,7 @@
var/oxydamage = L.getOxyLoss()
var/totaldamage = brutedamage + burndamage + oxydamage
if(!totaldamage && (!L.reagents || !L.reagents.has_reagent("holywater")))
ranged_ability_user << "<span class='inathneq'>\"[L] is unhurt and untainted.\"</span>"
to_chat(ranged_ability_user, "<span class='inathneq'>\"[L] is unhurt and untainted.\"</span>")
return TRUE
successful = TRUE
@@ -130,14 +130,14 @@
else
clockwork_say(ranged_ability_user, text2ratvar("Purge foul darkness!"))
add_logs(ranged_ability_user, L, "purged of holy water with Sentinel's Compromise")
ranged_ability_user << "<span class='brass'>You bathe [L == ranged_ability_user ? "yourself":"[L]"] in Inath-neq's power!</span>"
to_chat(ranged_ability_user, "<span class='brass'>You bathe [L == ranged_ability_user ? "yourself":"[L]"] in Inath-neq's power!</span>")
L.visible_message("<span class='warning'>A blue light washes over [L], mending [L.p_their()] bruises and burns!</span>", \
"<span class='heavy_brass'>You feel Inath-neq's power healing your wounds, but a deep nausea overcomes you!</span>")
playsound(targetturf, 'sound/magic/Staff_Healing.ogg', 50, 1)
if(L.reagents && L.reagents.has_reagent("holywater"))
L.reagents.remove_reagent("holywater", 1000)
L << "<span class='heavy_brass'>Ratvar's light flares, banishing the darkness. Your devotion remains intact!</span>"
to_chat(L, "<span class='heavy_brass'>Ratvar's light flares, banishing the darkness. Your devotion remains intact!</span>")
remove_ranged_ability()
@@ -194,13 +194,13 @@
if(isliving(target) && (target in view(7, get_turf(ranged_ability_user))))
var/mob/living/L = target
if(!is_servant_of_ratvar(L))
ranged_ability_user << "<span class='inathneq'>\"[L] does not yet serve Ratvar.\"</span>"
to_chat(ranged_ability_user, "<span class='inathneq'>\"[L] does not yet serve Ratvar.\"</span>")
return TRUE
if(L.stat == DEAD)
ranged_ability_user << "<span class='inathneq'>\"[L.p_they(TRUE)] [L.p_are()] dead. [text2ratvar("Oh, child. To have your life cut short...")]\"</span>"
to_chat(ranged_ability_user, "<span class='inathneq'>\"[L.p_they(TRUE)] [L.p_are()] dead. [text2ratvar("Oh, child. To have your life cut short...")]\"</span>")
return TRUE
if(islist(L.stun_absorption) && L.stun_absorption["vanguard"] && L.stun_absorption["vanguard"]["end_time"] > world.time)
ranged_ability_user << "<span class='inathneq'>\"[L.p_they(TRUE)] [L.p_are()] already shielded by a Vanguard.\"</span>"
to_chat(ranged_ability_user, "<span class='inathneq'>\"[L.p_they(TRUE)] [L.p_are()] already shielded by a Vanguard.\"</span>")
return TRUE
successful = TRUE
@@ -12,20 +12,20 @@
/obj/item/clockwork/component/pickup(mob/living/user)
..()
if(iscultist(user) || (user.mind && user.mind.isholy))
user << "<span class='[message_span]'>[cultist_message]</span>"
to_chat(user, "<span class='[message_span]'>[cultist_message]</span>")
if(user.mind && user.mind.isholy)
user << "<span class='boldannounce'>The power of your faith melts away the [src]!</span>"
to_chat(user, "<span class='boldannounce'>The power of your faith melts away the [src]!</span>")
var/obj/item/weapon/ore/slag/wrath = new /obj/item/weapon/ore/slag
qdel(src)
user.put_in_active_hand(wrath)
if(is_servant_of_ratvar(user) && prob(20))
var/pickedmessage = pick(servant_of_ratvar_messages)
user << "<span class='[message_span]'>[servant_of_ratvar_messages[pickedmessage] ? "[text2ratvar(pickedmessage)]" : pickedmessage]</span>"
to_chat(user, "<span class='[message_span]'>[servant_of_ratvar_messages[pickedmessage] ? "[text2ratvar(pickedmessage)]" : pickedmessage]</span>")
/obj/item/clockwork/component/examine(mob/user)
..()
if(is_servant_of_ratvar(user))
user << "<span class='[message_span]'>You should put this in a slab or cache immediately.</span>"
to_chat(user, "<span class='[message_span]'>You should put this in a slab or cache immediately.</span>")
/obj/item/clockwork/component/belligerent_eye
name = "belligerent eye"
@@ -53,6 +53,13 @@
cultist_message = "The gem turns black and cold for a moment before its normal glow returns."
servant_of_ratvar_messages = list("\"Disgusting failure.\"" = TRUE, "You feel scrutinized." = FALSE, "\"Weaklings.\"" = TRUE, "\"Pathetic defenses.\"" = TRUE)
w_class = WEIGHT_CLASS_TINY
light_range = 1.4
light_power = 0.4
light_color = "#F42B9D"
/obj/item/clockwork/component/belligerent_eye/lens_gem/New()
..()
update_light()
/obj/item/clockwork/component/vanguard_cogwheel
name = "vanguard cogwheel"
@@ -33,14 +33,14 @@
..()
if(slot == slot_head && !is_servant_of_ratvar(user))
if(!iscultist(user))
user << "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>"
to_chat(user, "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>")
user.visible_message("<span class='warning'>As [user] puts [src] on, it flickers off their head!</span>", "<span class='warning'>The helmet flickers off your head, leaving only nausea!</span>")
if(iscarbon(user))
var/mob/living/carbon/C = user
C.vomit(20, 1, 1, 0, 1)
else
user << "<span class='heavy_brass'>\"Do you have a hole in your head? You're about to.\"</span>"
user << "<span class='userdanger'>The helmet tries to drive a spike through your head as you scramble to remove it!</span>"
to_chat(user, "<span class='heavy_brass'>\"Do you have a hole in your head? You're about to.\"</span>")
to_chat(user, "<span class='userdanger'>The helmet tries to drive a spike through your head as you scramble to remove it!</span>")
user.emote("scream")
user.apply_damage(30, BRUTE, "head")
user.adjustBrainLoss(30)
@@ -94,14 +94,14 @@
..()
if(slot == slot_wear_suit && !is_servant_of_ratvar(user))
if(!iscultist(user))
user << "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>"
to_chat(user, "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>")
user.visible_message("<span class='warning'>As [user] puts [src] on, it flickers off their body!</span>", "<span class='warning'>The curiass flickers off your body, leaving only nausea!</span>")
if(iscarbon(user))
var/mob/living/carbon/C = user
C.vomit(20, 1, 1, 0, 1)
else
user << "<span class='heavy_brass'>\"I think this armor is too hot for you to handle.\"</span>"
user << "<span class='userdanger'>The curiass emits a burst of flame as you scramble to get it off!</span>"
to_chat(user, "<span class='heavy_brass'>\"I think this armor is too hot for you to handle.\"</span>")
to_chat(user, "<span class='userdanger'>The curiass emits a burst of flame as you scramble to get it off!</span>")
user.emote("scream")
user.apply_damage(15, BURN, "chest")
user.adjust_fire_stacks(2)
@@ -155,14 +155,14 @@
..()
if(slot == slot_gloves && !is_servant_of_ratvar(user))
if(!iscultist(user))
user << "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>"
to_chat(user, "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>")
user.visible_message("<span class='warning'>As [user] puts [src] on, it flickers off their arms!</span>", "<span class='warning'>The gauntlets flicker off your arms, leaving only nausea!</span>")
if(iscarbon(user))
var/mob/living/carbon/C = user
C.vomit(10, 1, 1, 0, 1)
else
user << "<span class='heavy_brass'>\"Did you like having arms?\"</span>"
user << "<span class='userdanger'>The gauntlets suddenly squeeze tight, crushing your arms before you manage to get them off!</span>"
to_chat(user, "<span class='heavy_brass'>\"Did you like having arms?\"</span>")
to_chat(user, "<span class='userdanger'>The gauntlets suddenly squeeze tight, crushing your arms before you manage to get them off!</span>")
user.emote("scream")
user.apply_damage(7, BRUTE, "l_arm")
user.apply_damage(7, BRUTE, "r_arm")
@@ -205,14 +205,14 @@
..()
if(slot == slot_shoes && !is_servant_of_ratvar(user))
if(!iscultist(user))
user << "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>"
to_chat(user, "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>")
user.visible_message("<span class='warning'>As [user] puts [src] on, it flickers off their feet!</span>", "<span class='warning'>The treads flicker off your feet, leaving only nausea!</span>")
if(iscarbon(user))
var/mob/living/carbon/C = user
C.vomit(10, 1, 1, 0, 1)
else
user << "<span class='heavy_brass'>\"Let's see if you can dance with these.\"</span>"
user << "<span class='userdanger'>The treads turn searing hot as you scramble to get them off!</span>"
to_chat(user, "<span class='heavy_brass'>\"Let's see if you can dance with these.\"</span>")
to_chat(user, "<span class='userdanger'>The treads turn searing hot as you scramble to get them off!</span>")
user.emote("scream")
user.apply_damage(7, BURN, "l_leg")
user.apply_damage(7, BURN, "r_leg")
@@ -127,26 +127,26 @@
/obj/item/clockwork/clockwork_proselytizer/examine(mob/living/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
user << "<span class='brass'>Can be used to convert walls, floors, windows, airlocks, and a variety of other objects to clockwork variants.</span>"
user << "<span class='brass'>Can also form some objects into Brass sheets, as well as reform Clockwork Walls into Clockwork Floors, and vice versa.</span>"
to_chat(user, "<span class='brass'>Can be used to convert walls, floors, windows, airlocks, and a variety of other objects to clockwork variants.</span>")
to_chat(user, "<span class='brass'>Can also form some objects into Brass sheets, as well as reform Clockwork Walls into Clockwork Floors, and vice versa.</span>")
if(uses_power)
if(metal_to_power)
user << "<span class='alloy'>It can convert rods, metal, plasteel, and brass to power at rates of <b>1:[POWER_ROD]W</b>, <b>1:[POWER_METAL]W</b>, \
<b>1:[POWER_PLASTEEL]W</b>, and <b>1:[POWER_FLOOR]W</b>, respectively.</span>"
to_chat(user, "<span class='alloy'>It can convert rods, metal, plasteel, and brass to power at rates of <b>1:[POWER_ROD]W</b>, <b>1:[POWER_METAL]W</b>, \
<b>1:[POWER_PLASTEEL]W</b>, and <b>1:[POWER_FLOOR]W</b>, respectively.</span>")
else
user << "<span class='alloy'>It can convert brass to power at a rate of <b>1:[POWER_FLOOR]W</b>.</span>"
user << "<span class='alloy'>It is storing <b>[get_power()]W/[get_max_power()]W</b> of power, and is gaining <b>[charge_rate*0.5]W</b> of power per second.</span>"
user << "<span class='alloy'>Use it in-hand to produce brass sheets.</span>"
to_chat(user, "<span class='alloy'>It can convert brass to power at a rate of <b>1:[POWER_FLOOR]W</b>.</span>")
to_chat(user, "<span class='alloy'>It is storing <b>[get_power()]W/[get_max_power()]W</b> of power, and is gaining <b>[charge_rate*0.5]W</b> of power per second.</span>")
to_chat(user, "<span class='alloy'>Use it in-hand to produce <b>5</b> brass sheets at a cost of <b>[POWER_WALL_TOTAL]W</b> power.</span>")
/obj/item/clockwork/clockwork_proselytizer/attack_self(mob/living/user)
if(is_servant_of_ratvar(user))
if(!can_use_power(POWER_WALL_TOTAL))
user << "<span class='warning'>[src] requires <b>[POWER_WALL_TOTAL]W</b> of power to produce brass sheets!</span>"
to_chat(user, "<span class='warning'>[src] requires <b>[POWER_WALL_TOTAL]W</b> of power to produce brass sheets!</span>")
return
modify_stored_power(-POWER_WALL_TOTAL)
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
new/obj/item/stack/tile/brass(user.loc, 5)
user << "<span class='brass'>You user [stored_power ? "some":"all"] of [src]'s power to produce some brass sheets. It now stores <b>[get_power()]W/[get_max_power()]W</b> of power.</span>"
to_chat(user, "<span class='brass'>You user [stored_power ? "some":"all"] of [src]'s power to produce some brass sheets. It now stores <b>[get_power()]W/[get_max_power()]W</b> of power.</span>")
/obj/item/clockwork/clockwork_proselytizer/pre_attackby(atom/target, mob/living/user, params)
if(!target || !user || !is_servant_of_ratvar(user) || istype(target, /obj/item/weapon/storage))
@@ -180,14 +180,14 @@
if(!target || !user)
return FALSE
if(repairing)
user << "<span class='warning'>You are currently repairing [repairing] with [src]!</span>"
to_chat(user, "<span class='warning'>You are currently repairing [repairing] with [src]!</span>")
return FALSE
var/list/proselytize_values = target.proselytize_vals(user, src) //relevant values for proselytizing stuff, given as an associated list
if(!islist(proselytize_values))
if(proselytize_values != TRUE) //if we get true, fail, but don't send a message for whatever reason
if(!isturf(target)) //otherwise, if we didn't get TRUE and the original target wasn't a turf, try to proselytize the turf
return proselytize(get_turf(target), user, no_table_check)
user << "<span class='warning'>[target] cannot be proselytized!</span>"
to_chat(user, "<span class='warning'>[target] cannot be proselytized!</span>")
if(!no_table_check)
return TRUE
return FALSE
@@ -218,16 +218,16 @@
playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
var/new_thing_type = proselytize_values["new_obj_type"]
if(isturf(target))
if(isturf(target)) //if our target is a turf, we're just going to ChangeTurf it and assume it'll work out.
var/turf/T = target
T.ChangeTurf(new_thing_type)
else
if(proselytize_values["dir_in_new"])
new new_thing_type(get_turf(target), proselytize_values["spawn_dir"])
new new_thing_type(get_turf(target), proselytize_values["spawn_dir"]) //please verify that your new object actually wants to get a dir in New()
else
var/atom/A = new new_thing_type(get_turf(target))
A.setDir(proselytize_values["spawn_dir"])
if(!proselytize_values["no_target_deletion"])
if(!proselytize_values["no_target_deletion"]) //for some cases where proselytize_vals() modifies the object but doesn't want it deleted
qdel(target)
modify_stored_power(-proselytize_values["power_cost"])
if(no_table_check)
@@ -246,27 +246,29 @@
if(!can_use_power(proselytize_values["power_cost"]))
if(stored_power - proselytize_values["power_cost"] < 0)
if(!silent)
user << "<span class='warning'>You need <b>[proselytize_values["power_cost"]]W</b> power to proselytize [target]!</span>"
to_chat(user, "<span class='warning'>You need <b>[proselytize_values["power_cost"]]W</b> power to proselytize [target]!</span>")
else if(stored_power - proselytize_values["power_cost"] > max_power)
if(!silent)
user << "<span class='warning'>Your [name] contains too much power to proselytize [target]!</span>"
to_chat(user, "<span class='warning'>Your [name] contains too much power to proselytize [target]!</span>")
return FALSE
return TRUE
//The repair check proc.
//Is dark magic. Can probably kill you.
//What this proc does is it takes an existing list of values, which it modifies.
//This(modifying an existing object) is the only way to get information OUT of a do_after callback, which this is used as.
/obj/item/clockwork/clockwork_proselytizer/proc/proselytizer_repair_checks(list/repair_values, atom/target, mob/user, silent) //Exists entirely to avoid an otherwise unreadable series of checks.
if(!islist(repair_values) || !target || QDELETED(target) || !user)
return FALSE
if(isliving(target))
if(isliving(target)) //standard checks for if we can affect the target
var/mob/living/L = target
if(!is_servant_of_ratvar(L))
if(!silent)
user << "<span class='warning'>[L] does not serve Ratvar!</span>"
to_chat(user, "<span class='warning'>[L] does not serve Ratvar!</span>")
return FALSE
if(L.health >= L.maxHealth || (L.flags & GODMODE))
if(!silent)
user << "<span class='warning'>[L == user ? "You are" : "[L] is"] at maximum health!</span>"
to_chat(user, "<span class='warning'>[L == user ? "You are" : "[L] is"] at maximum health!</span>")
return FALSE
repair_values["amount_to_heal"] = L.maxHealth - L.health
else if(isobj(target))
@@ -274,23 +276,23 @@
var/obj/structure/destructible/clockwork/C = target
if(!C.can_be_repaired)
if(!silent)
user << "<span class='warning'>[C] cannot be repaired!</span>"
to_chat(user, "<span class='warning'>[C] cannot be repaired!</span>")
return FALSE
var/obj/O = target
if(O.obj_integrity >= O.max_integrity)
if(!silent)
user << "<span class='warning'>[O] is at maximum integrity!</span>"
to_chat(user, "<span class='warning'>[O] is at maximum integrity!</span>")
return FALSE
repair_values["amount_to_heal"] = O.max_integrity - O.obj_integrity
else
return FALSE
if(repair_values["amount_to_heal"] <= 0)
if(repair_values["amount_to_heal"] <= 0) //nothing to heal!
return FALSE
repair_values["healing_for_cycle"] = min(repair_values["amount_to_heal"], PROSELYTIZER_REPAIR_PER_TICK)
repair_values["power_required"] = round(repair_values["healing_for_cycle"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)
repair_values["healing_for_cycle"] = min(repair_values["amount_to_heal"], PROSELYTIZER_REPAIR_PER_TICK) //modify the healing for this cycle
repair_values["power_required"] = round(repair_values["healing_for_cycle"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER) //and get the power cost from that
if(!can_use_power(RATVAR_POWER_CHECK) && !can_use_power(repair_values["power_required"]))
if(!silent)
user << "<span class='warning'>You need at least <b>[repair_values["power_required"]]W</b> power to start repairin[target == user ? "g yourself" : "g [target]"], and at least \
<b>[round(repair_values["amount_to_heal"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]W</b> to fully repair [target == user ? "yourself" : "[target.p_them()]"]!</span>"
to_chat(user, "<span class='warning'>You need at least <b>[repair_values["power_required"]]W</b> power to start repairin[target == user ? "g yourself" : "g [target]"], and at least \
<b>[round(repair_values["amount_to_heal"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]W</b> to fully repair [target == user ? "yourself" : "[target.p_them()]"]!</span>")
return FALSE
return TRUE
@@ -81,7 +81,7 @@
quickbound = list(/datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/channeled/volt_void/cyborg)
/obj/item/clockwork/slab/cyborg/access_display(mob/living/user)
user << "<span class='warning'>Use the action buttons to recite your limited set of scripture!</span>"
to_chat(user, "<span class='warning'>Use the action buttons to recite your limited set of scripture!</span>")
/obj/item/clockwork/slab/New()
..()
@@ -138,7 +138,7 @@
if(S == src)
continue
S.production_time = production_time + 50 //set it to our next production plus five seconds, so that if you hold the same slabs, the same one will always generate
L << "<span class='warning'>Your slab cl[pick("ank", "ink", "unk", "ang")]s as it produces a </span><span class='[get_component_span(component_to_generate)]'>component</span><span class='warning'>.</span>"
to_chat(L, "<span class='warning'>Your slab cl[pick("ank", "ink", "unk", "ang")]s as it produces a </span><span class='[get_component_span(component_to_generate)]'>component</span><span class='warning'>.</span>")
/obj/item/clockwork/slab/examine(mob/user)
..()
@@ -148,16 +148,16 @@
if(!quickbound[i])
continue
var/datum/clockwork_scripture/quickbind_slot = quickbound[i]
user << "<b>Quickbind</b> button: <span class='[get_component_span(initial(quickbind_slot.primary_component))]'>[initial(quickbind_slot.name)]</span>."
if(clockwork_caches)
user << "<b>Stored components (with global cache):</b>"
to_chat(user, "<b>Quickbind</b> button: <span class='[get_component_span(initial(quickbind_slot.primary_component))]'>[initial(quickbind_slot.name)]</span>.")
if(clockwork_caches) //show components on examine
to_chat(user, "<b>Stored components (with global cache):</b>")
for(var/i in stored_components)
user << "<span class='[get_component_span(i)]_small'><i>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</i> <b>[stored_components[i]]</b> \
(<b>[stored_components[i] + clockwork_component_cache[i]]</b>)</span>"
to_chat(user, "<span class='[get_component_span(i)]_small'><i>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</i> <b>[stored_components[i]]</b> \
(<b>[stored_components[i] + clockwork_component_cache[i]]</b>)</span>")
else
user << "<b>Stored components:</b>"
to_chat(user, "<b>Stored components:</b>")
for(var/i in stored_components)
user << "<span class='[get_component_span(i)]_small'><i>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</i> <b>[stored_components[i]]</b></span>"
to_chat(user, "<span class='[get_component_span(i)]_small'><i>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</i> <b>[stored_components[i]]</b></span>")
//Component Transferal
/obj/item/clockwork/slab/attack(mob/living/target, mob/living/carbon/human/user)
@@ -174,7 +174,7 @@
targetslab = S
if(targetslab)
if(targetslab == src)
user << "<span class='heavy_brass'>\"You can't transfer components into your own slab, idiot.\"</span>"
to_chat(user, "<span class='heavy_brass'>\"You can't transfer components into your own slab, idiot.\"</span>")
else
for(var/i in stored_components)
targetslab.stored_components[i] += stored_components[i]
@@ -184,7 +184,7 @@
user.visible_message("<span class='notice'>[user] empties [src] into [target]'s [targetslab.name].</span>", \
"<span class='notice'>You transfer your slab's components into [target]'s [targetslab.name].</span>")
else
user << "<span class='warning'>[target] has no slabs to transfer components to.</span>"
to_chat(user, "<span class='warning'>[target] has no slabs to transfer components to.</span>")
else
return ..()
@@ -226,7 +226,7 @@
/obj/item/clockwork/slab/proc/show_hierophant(mob/living/user)
if(!user.can_speak_vocal())
user << "<span class='warning'>You cannot speak into the slab!</span>"
to_chat(user, "<span class='warning'>You cannot speak into the slab!</span>")
return FALSE
var/message = stripped_input(user, "Enter a message to send to your fellow servants.", "Hierophant")
if(!message || !user || !user.canUseTopic(src) || !user.can_speak_vocal())
@@ -238,7 +238,7 @@
//Scripture Recital
/obj/item/clockwork/slab/attack_self(mob/living/user)
if(iscultist(user))
user << "<span class='heavy_brass'>\"You reek of blood. You've got a lot of nerve to even look at that slab.\"</span>"
to_chat(user, "<span class='heavy_brass'>\"You reek of blood. You've got a lot of nerve to even look at that slab.\"</span>")
user.visible_message("<span class='warning'>A sizzling sound comes from [user]'s hands!</span>", "<span class='userdanger'>[src] suddenly grows extremely hot in your hands!</span>")
playsound(get_turf(user), 'sound/weapons/sear.ogg', 50, 1)
user.drop_item()
@@ -247,15 +247,15 @@
user.apply_damage(5, BURN, "r_arm")
return 0
if(!is_servant_of_ratvar(user))
user << "<span class='warning'>The information on [src]'s display shifts rapidly. After a moment, your head begins to pound, and you tear your eyes away.</span>"
to_chat(user, "<span class='warning'>The information on [src]'s display shifts rapidly. After a moment, your head begins to pound, and you tear your eyes away.</span>")
user.confused += 5
user.dizziness += 5
return 0
if(busy)
user << "<span class='warning'>[src] refuses to work, displaying the message: \"[busy]!\"</span>"
to_chat(user, "<span class='warning'>[src] refuses to work, displaying the message: \"[busy]!\"</span>")
return 0
if(!nonhuman_usable && !ishuman(user))
user << "<span class='nezbere'>[src] hums fitfully in your hands, but doesn't seem to do anything...</span>"
to_chat(user, "<span class='nezbere'>[src] hums fitfully in your hands, but doesn't seem to do anything...</span>")
return 0
access_display(user)
@@ -277,13 +277,13 @@
if(!scripture || !user || !user.canUseTopic(src) || (!nonhuman_usable && !ishuman(user)))
return FALSE
if(user.get_active_held_item() != src)
user << "<span class='warning'>You need to hold the slab in your active hand to recite scripture!</span>"
to_chat(user, "<span class='warning'>You need to hold the slab in your active hand to recite scripture!</span>")
return FALSE
var/initial_tier = initial(scripture.tier)
if(initial_tier != SCRIPTURE_PERIPHERAL)
var/list/tiers_of_scripture = scripture_unlock_check()
if(!ratvar_awakens && !no_cost && !tiers_of_scripture[initial_tier])
user << "<span class='warning'>That scripture is not unlocked, and cannot be recited!</span>"
to_chat(user, "<span class='warning'>That scripture is not unlocked, and cannot be recited!</span>")
return FALSE
var/datum/clockwork_scripture/scripture_to_recite = new scripture
scripture_to_recite.slab = src
@@ -369,17 +369,17 @@
<font color=#BE8700 size=3><b><center>Purge all untruths and honor Ratvar.</center></b></font>"
return textlist.Join()
/obj/item/clockwork/slab/ui_data(mob/user)
/obj/item/clockwork/slab/ui_data(mob/user) //we display a lot of data via TGUI
var/list/data = list()
data["components"] = stored_components.Copy()
var/list/temp_data = list("<font color=#B18B25>")
for(var/i in data["components"])
for(var/i in data["components"]) //display the slab's components
temp_data += "<font color=[get_component_color_bright(i)]>[get_component_acronym(i)] <b>[data["components"][i]]</b></font>"
if(i != HIEROPHANT_ANSIBLE)
temp_data += " "
else
temp_data += " ("
if(clockwork_caches)
if(clockwork_caches) //if we have caches, display what's in the global cache
for(var/i in clockwork_component_cache)
temp_data += "<font color=[get_component_color_bright(i)]>[get_component_acronym(i)] <b>[data["components"][i] + clockwork_component_cache[i]]</b></font>"
if(i != HIEROPHANT_ANSIBLE)
@@ -390,7 +390,7 @@
temp_data = temp_data.Join()
data["components"] = temp_data
switch(selected_scripture)
switch(selected_scripture) //display info based on selected scripture tier
if(SCRIPTURE_DRIVER)
data["tier_info"] = "<font color=#B18B25><i>These scriptures are always unlocked.</i></font>"
if(SCRIPTURE_SCRIPT)
@@ -405,7 +405,7 @@
data["selected"] = selected_scripture
data["target_comp"] = "<font color=#B18B25>NONE</font>"
if(target_component_id)
if(target_component_id) //if we have a component to make, display that, too
data["target_comp"] = "<font color=[get_component_color_bright(target_component_id)]>[get_component_acronym(target_component_id)]</font>"
generate_all_scripture()
@@ -413,7 +413,7 @@
data["scripture"] = list()
for(var/s in all_scripture)
var/datum/clockwork_scripture/S = all_scripture[s]
if(S.tier == selected_scripture)
if(S.tier == selected_scripture) //display only scriptures of the selected tier
var/scripture_color = get_component_color_bright(S.primary_component)
var/list/temp_info = list("name" = "<font color=[scripture_color]><b>[S.name]</b></font>",
"descname" = "<font color=[scripture_color]>([S.descname])</font>",
@@ -493,7 +493,7 @@
/obj/item/clockwork/slab/proc/update_quickbind()
for(var/datum/action/item_action/clock/quickbind/Q in actions)
qdel(Q)
qdel(Q) //regenerate all our quickbound scriptures
if(LAZYLEN(quickbound))
for(var/i in 1 to quickbound.len)
if(!quickbound[i])
@@ -503,7 +503,7 @@
var/datum/clockwork_scripture/quickbind_slot = all_scripture[quickbound[i]]
Q.name = "[quickbind_slot.name] ([Q.scripture_index])"
var/list/temp_desc = list()
for(var/c in quickbind_slot.consumed_components)
for(var/c in quickbind_slot.consumed_components) //show how much the bound scripture costs
if(quickbind_slot.consumed_components[c])
temp_desc += "<font color=[get_component_color_bright(c)]>[get_component_acronym(c)] <b>[quickbind_slot.consumed_components[c]]</b></font> "
if(LAZYLEN(temp_desc))
@@ -44,8 +44,8 @@
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>"
to_chat(user, "<span class='heavy_brass'>\"Consider yourself judged, whelp.\"</span>")
to_chat(user, "<span class='userdanger'>You suddenly catch fire!</span>")
user.adjust_fire_stacks(5)
user.IgniteMob()
return 1
@@ -79,10 +79,10 @@
return 0
switch(active)
if(TRUE)
L << "<span class='notice'>As you put on [src], its lens begins to glow, information flashing before your eyes.</span>\n\
<span class='heavy_brass'>Judicial visor active. Use the action button to gain the ability to smite the unworthy.</span>"
to_chat(L, "<span class='notice'>As you put on [src], its lens begins to glow, information flashing before your eyes.</span>\n\
<span class='heavy_brass'>Judicial visor active. Use the action button to gain the ability to smite the unworthy.</span>")
if(FALSE)
L << "<span class='notice'>As you take off [src], its lens darkens once more.</span>"
to_chat(L, "<span class='notice'>As you take off [src], its lens darkens once more.</span>")
return 1
/obj/item/clothing/glasses/judicial_visor/proc/recharge_visor(mob/living/user)
@@ -90,7 +90,7 @@
return 0
recharging = FALSE
if(user && src == user.get_item_by_slot(slot_glasses))
user << "<span class='brass'>Your [name] hums. It is ready.</span>"
to_chat(user, "<span class='brass'>Your [name] hums. It is ready.</span>")
else
active = FALSE
icon_state = "judicial_visor_[active]"
@@ -158,7 +158,7 @@
/obj/effect/clockwork/judicial_marker/New(loc, caster)
..()
SetLuminosity(4, 3)
set_light(1.4, 2, "#FE9C11")
user = caster
INVOKE_ASYNC(src, .proc/judicialblast)
@@ -168,10 +168,11 @@
sleep(16)
layer = ABOVE_ALL_MOB_LAYER
flick("judicial_explosion", src)
set_light(1.4, 2, "#B451A1")
sleep(13)
var/targetsjudged = 0
playsound(src, 'sound/effects/explosionfar.ogg', 100, 1, 1, 1)
SetLuminosity(0)
set_light(0)
for(var/mob/living/L in range(1, src))
if(is_servant_of_ratvar(L))
continue
@@ -183,20 +184,20 @@
if(!iscultist(L))
L.visible_message("<span class='warning'>[L] is struck by a judicial explosion!</span>", \
"<span class='userdanger'>[!issilicon(L) ? "An unseen force slams you into the ground!" : "ERROR: Motor servos disabled by external source!"]</span>")
L.Weaken(8)
L.Weaken(8) //stun targets for 14-16 seconds
else
L.visible_message("<span class='warning'>[L] is struck by a judicial explosion!</span>", \
"<span class='heavy_brass'>\"Keep an eye out, filth.\"</span>\n<span class='userdanger'>A burst of heat crushes you against the ground!</span>")
L.Weaken(4) //half the stun, but sets cultists on fire
L.Weaken(4) //stun for 6-8 seconds, but set cultist targets 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)
L.adjustBruteLoss(10) //do a small amount of damage
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 == 1 ? "":"s"].</b></span>"
to_chat(user, "<span class='brass'><b>[targetsjudged ? "Successfully judged <span class='neovgre'>[targetsjudged]</span>":"Judged no"] heretic[targetsjudged == 1 ? "":"s"].</b></span>")
sleep(3) //so the animation completes properly
qdel(src)
@@ -52,22 +52,22 @@
/obj/item/clockwork/ratvarian_spear/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
user << "<span class='brass'>Stabbing a human you are pulling or have grabbed with the spear will impale them, doing massive damage and stunning.</span>"
to_chat(user, "<span class='brass'>Stabbing a human you are pulling or have grabbed with the spear will impale them, doing massive damage and stunning.</span>")
if(!iscyborg(user))
user << "<span class='brass'>Throwing the spear will do massive damage, break the spear, and stun the target.</span>"
to_chat(user, "<span class='brass'>Throwing the spear will do massive damage, break the spear, and stun the target.</span>")
/obj/item/clockwork/ratvarian_spear/attack(mob/living/target, mob/living/carbon/human/user)
var/impaling = FALSE
if(attack_cooldown > world.time)
user << "<span class='warning'>You can't attack right now, wait [max(round((attack_cooldown - world.time)*0.1, 0.1), 0)] seconds!</span>"
to_chat(user, "<span class='warning'>You can't attack right now, wait [max(round((attack_cooldown - world.time)*0.1, 0.1), 0)] seconds!</span>")
return
if(user.pulling && ishuman(user.pulling) && user.pulling == target)
if(impale_cooldown > world.time)
user << "<span class='warning'>You can't impale [target] yet, wait [max(round((impale_cooldown - world.time)*0.1, 0.1), 0)] seconds!</span>"
to_chat(user, "<span class='warning'>You can't impale [target] yet, wait [max(round((impale_cooldown - world.time)*0.1, 0.1), 0)] seconds!</span>")
else
impaling = TRUE
attack_verb = list("impaled")
force += 22 //40 damage if ratvar isn't alive, 50 if he is
force += 22 //total 40 damage if ratvar isn't alive, 50 if he is
armour_penetration += 10 //if you're impaling someone, armor sure isn't that useful
user.stop_pulling()
@@ -78,19 +78,19 @@
user.do_attack_animation(target)
if(!target.attacked_by(src, user)) //TODO MAKE ATTACK() USE PROPER RETURN VALUES
impaling = FALSE //if we got blocked, stop impaling
else if(!target.null_rod_check())
else if(!target.null_rod_check()) //if they don't have a null rod, we do bonus damage on a successful attack
if(issilicon(target))
var/mob/living/silicon/S = target
if(S.stat != DEAD)
S.visible_message("<span class='warning'>[S] shudders violently at [src]'s touch!</span>", "<span class='userdanger'>ERROR: Temperature rising!</span>")
S.adjustFireLoss(22)
else if(iscultist(target) || isconstruct(target)) //Cultists take extra fire damage
S.adjustFireLoss(22) //total 37 damage on borgs
else if(iscultist(target) || isconstruct(target))
var/mob/living/M = target
if(M.stat != DEAD)
M << "<span class='userdanger'>Your body flares with agony at [src]'s presence!</span>"
M.adjustFireLoss(15)
to_chat(M, "<span class='userdanger'>Your body flares with agony at [src]'s presence!</span>")
M.adjustFireLoss(15) //total 30 damage on cultists
else
target.adjustFireLoss(3)
target.adjustFireLoss(3) //anything else takes a total of 18
add_logs(user, target, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])")
add_fingerprint(user)
@@ -98,11 +98,11 @@
ratvar_act()
if(impaling)
impale_cooldown = world.time + initial(impale_cooldown)
attack_cooldown = world.time + initial(attack_cooldown)
attack_cooldown = world.time + initial(attack_cooldown) //can't attack until we're done impaling
if(target)
new /obj/effect/overlay/temp/dir_setting/bloodsplatter(get_turf(target), get_dir(user, target))
target.Stun(2)
user << "<span class='brass'>You prepare to remove your ratvarian spear from [target]...</span>"
target.Stun(2) //brief stun
to_chat(user, "<span class='brass'>You prepare to remove your ratvarian spear from [target]...</span>")
var/remove_verb = pick("pull", "yank", "drag")
if(do_after(user, 10, 1, target))
var/turf/T = get_turf(target)
@@ -113,18 +113,18 @@
user.visible_message("<span class='warning'>[user] [remove_verb]s [src] out of [target]!</span>", "<span class='warning'>You [remove_verb] your spear from [target]!</span>")
else
user.visible_message("<span class='warning'>[user] kicks [target] off of [src]!</span>", "<span class='warning'>You kick [target] off of [src]!</span>")
target << "<span class='userdanger'>You scream in pain as you're kicked off of [src]!</span>"
to_chat(target, "<span class='userdanger'>You scream in pain as you're kicked off of [src]!</span>")
target.emote("scream")
step(target, get_dir(user, target))
T = get_turf(target)
B.forceMove(T)
target.Weaken(2)
target.Weaken(2) //then weaken if we stayed next to them
playsound(T, 'sound/weapons/thudswoosh.ogg', 50, 1)
flash_color(target, flash_color="#911414", flash_time=8)
else if(target) //it's a do_after, we gotta check again to make sure they didn't get deleted
user.visible_message("<span class='warning'>[user] [remove_verb]s [src] out of [target]!</span>", "<span class='warning'>You [remove_verb] your spear from [target]!</span>")
if(target.stat == CONSCIOUS)
target << "<span class='userdanger'>You scream in pain as [src] is suddenly [remove_verb]ed out of you!</span>"
to_chat(target, "<span class='userdanger'>You scream in pain as [src] is suddenly [remove_verb]ed out of you!</span>")
target.emote("scream")
flash_color(target, flash_color="#911414", flash_time=4)
@@ -48,7 +48,7 @@
/obj/item/device/mmi/posibrain/soul_vessel/attack_self(mob/living/user)
if(!is_servant_of_ratvar(user))
user << "<span class='warning'>You fiddle around with [src], to no avail.</span>"
to_chat(user, "<span class='warning'>You fiddle around with [src], to no avail.</span>")
return 0
..()
@@ -57,35 +57,35 @@
..()
return
if(used || (brainmob && brainmob.key))
user << "<span class='nezbere'>\"This vessel is filled, friend. Provide it with a body.\"</span>"
to_chat(user, "<span class='nezbere'>\"This vessel is filled, friend. Provide it with a body.\"</span>")
return
if(is_servant_of_ratvar(target))
user << "<span class='nezbere'>\"It would be more wise to revive your allies, friend.\"</span>"
to_chat(user, "<span class='nezbere'>\"It would be more wise to revive your allies, friend.\"</span>")
return
var/mob/living/carbon/human/H = target
var/obj/item/bodypart/head/HE = H.get_bodypart("head")
var/obj/item/organ/brain/B = H.getorgan(/obj/item/organ/brain)
if(!HE)
user << "<span class='warning'>[H] has no head, and thus no mind!</span>"
return
if(H.stat == CONSCIOUS)
user << "<span class='warning'>[H] must be dead or unconscious for you to claim [H.p_their()] mind!</span>"
to_chat(user, "<span class='warning'>[H] must be dead or unconscious for you to claim [H.p_their()] mind!</span>")
return
if(H.head)
var/obj/item/I = H.head
if(I.flags_inv & HIDEHAIR)
user << "<span class='warning'>[H]'s head is covered, remove [H.head] first!</span>"
if(I.flags_inv & HIDEHAIR) //they're wearing a hat that covers their skull
to_chat(user, "<span class='warning'>[H]'s head is covered, remove [H.head] first!</span>")
return
if(H.wear_mask)
var/obj/item/I = H.wear_mask
if(I.flags_inv & HIDEHAIR)
user << "<span class='warning'>[H]'s head is covered, remove [H.wear_mask] first!</span>"
if(I.flags_inv & HIDEHAIR) //they're wearing a mask that covers their skull
to_chat(user, "<span class='warning'>[H]'s head is covered, remove [H.wear_mask] first!</span>")
return
if(!B)
user << "<span class='warning'>[H] has no brain, and thus no mind to claim!</span>"
var/obj/item/bodypart/head/HE = H.get_bodypart("head")
if(!HE) //literally headless
to_chat(user, "<span class='warning'>[H] has no head, and thus no mind to claim!</span>")
return
if(!H.key)
user << "<span class='warning'>[H] has no mind to claim!</span>"
var/obj/item/organ/brain/B = H.getorgan(/obj/item/organ/brain)
if(!B) //either somebody already got to them or robotics did
to_chat(user, "<span class='warning'>[H] has no brain, and thus no mind to claim!</span>")
return
if(!H.key) //nobody's home
to_chat(user, "<span class='warning'>[H] has no mind to claim!</span>")
return
playsound(H, 'sound/misc/splort.ogg', 60, 1, -1)
playsound(H, 'sound/magic/clockwork/anima_fragment_attack.ogg', 40, 1, -1)
@@ -33,23 +33,23 @@
var/mob/living/carbon/human/H = loc
if(src == H.glasses && !up)
if(H.disabilities & BLIND)
H << "<span class='heavy_brass'>\"You're blind, idiot. Stop embarrassing yourself.\"</span>"
to_chat(H, "<span class='heavy_brass'>\"You're blind, idiot. Stop embarrassing yourself.\"</span>")
return
if(blind_cultist(H))
return
if(is_servant_of_ratvar(H))
H << "<span class='heavy_brass'>You push the spectacles down, and all is revealed to you.[ratvar_awakens ? "" : " Your eyes begin to itch - you cannot do this for long."]</span>"
to_chat(H, "<span class='heavy_brass'>You push the spectacles down, and all is revealed to you.[ratvar_awakens ? "" : " Your eyes begin to itch - you cannot do this for long."]</span>")
var/datum/status_effect/wraith_spectacles/WS = H.has_status_effect(STATUS_EFFECT_WRAITHSPECS)
if(WS)
WS.apply_eye_damage(H)
H.apply_status_effect(STATUS_EFFECT_WRAITHSPECS)
else
H << "<span class='heavy_brass'>You push the spectacles down, but you can't see through the glass.</span>"
to_chat(H, "<span class='heavy_brass'>You push the spectacles down, but you can't see through the glass.</span>")
/obj/item/clothing/glasses/wraith_spectacles/proc/blind_cultist(mob/living/victim)
if(iscultist(victim))
victim << "<span class='heavy_brass'>\"It looks like Nar-Sie's dogs really don't value their eyes.\"</span>"
victim << "<span class='userdanger'>Your eyes explode with horrific pain!</span>"
to_chat(victim, "<span class='heavy_brass'>\"It looks like Nar-Sie's dogs really don't value their eyes.\"</span>")
to_chat(victim, "<span class='userdanger'>Your eyes explode with horrific pain!</span>")
victim.emote("scream")
victim.become_blind()
victim.adjust_blurriness(30)
@@ -77,25 +77,25 @@
if(slot != slot_glasses || up)
return
if(user.disabilities & BLIND)
user << "<span class='heavy_brass'>\"You're blind, idiot. Stop embarrassing yourself.\"</span>" //Ratvar with the sick burns yo
to_chat(user, "<span class='heavy_brass'>\"You're blind, idiot. Stop embarrassing yourself.\"</span>" )
return
if(blind_cultist(user)) //Cultists instantly go blind
return
set_vision_vars(TRUE)
if(is_servant_of_ratvar(user))
user << "<span class='heavy_brass'>As you put on the spectacles, all is revealed to you.[ratvar_awakens ? "" : " Your eyes begin to itch - you cannot do this for long."]</span>"
to_chat(user, "<span class='heavy_brass'>As you put on the spectacles, all is revealed to you.[ratvar_awakens ? "" : " Your eyes begin to itch - you cannot do this for long."]</span>")
var/datum/status_effect/wraith_spectacles/WS = user.has_status_effect(STATUS_EFFECT_WRAITHSPECS)
if(WS)
WS.apply_eye_damage(user)
user.apply_status_effect(STATUS_EFFECT_WRAITHSPECS)
else
user << "<span class='heavy_brass'>You put on the spectacles, but you can't see through the glass.</span>"
to_chat(user, "<span class='heavy_brass'>You put on the spectacles, but you can't see through the glass.</span>")
//The effect that causes/repairs the damage the spectacles cause.
/datum/status_effect/wraith_spectacles
id = "wraith_spectacles"
duration = -1 //remains until eye damage done reaches 0 while the glasses are not worn
tick_interval = 2
tick_interval = 20
alert_type = /obj/screen/alert/status_effect/wraith_spectacles
var/eye_damage_done = 0
var/nearsight_breakpoint = 30
@@ -160,9 +160,9 @@
H.adjust_blurriness(2)
if(eye_damage_done >= nearsight_breakpoint)
if(H.become_nearsighted())
H << "<span class='nzcrentr'>Your vision doubles, then trebles. Darkness begins to close in. You can't keep this up!</span>"
to_chat(H, "<span class='nzcrentr'>Your vision doubles, then trebles. Darkness begins to close in. You can't keep this up!</span>")
if(eye_damage_done >= blind_breakpoint)
if(H.become_blind())
H << "<span class='nzcrentr_large'>A piercing white light floods your vision. Suddenly, all goes dark!</span>"
to_chat(H, "<span class='nzcrentr_large'>A piercing white light floods your vision. Suddenly, all goes dark!</span>")
if(prob(min(20, 5 + eye_damage_done)))
H << "<span class='nzcrentr_small'><i>Your eyes continue to burn.</i></span>"
to_chat(H, "<span class='nzcrentr_small'><i>Your eyes continue to burn.</i></span>")
+3 -2
View File
@@ -17,6 +17,7 @@
verb_exclaim = "proclaims"
verb_yell = "harangues"
bubble_icon = "clock"
light_color = "#E42742"
death_sound = 'sound/magic/clockwork/anima_fragment_death.ogg'
var/playstyle_string = "<span class='heavy_brass'>You are a bug, yell at whoever spawned you!</span>"
@@ -26,7 +27,7 @@
/mob/living/simple_animal/hostile/clockwork/Login()
..()
add_servant_of_ratvar(src, TRUE)
src << playstyle_string
to_chat(src, playstyle_string)
/mob/living/simple_animal/hostile/clockwork/ratvar_act()
fully_heal(TRUE)
@@ -48,4 +49,4 @@
msg += "</span>"
msg += "*---------*</span>"
user << msg
to_chat(user, msg)
@@ -14,21 +14,23 @@
weather_immunities = list("lava")
movement_type = FLYING
playstyle_string = "<span class='heavy_brass'>You are an anima fragment</span><b>, a clockwork creation of Ratvar. As a fragment, you have decent health that very gradually regenerates, do \
decent damage, and move at extreme speed in addition to being immune to extreme temperatures and pressures. Taking damage will temporarily slow you down, however.\n\
decent damage, and move at extreme speed in addition to being immune to extreme temperatures and pressures. Taking damage, and slamming into non-Servants, will temporarily slow you down, however.\n\
Your goal is to serve the Justiciar and his servants in any way you can. You yourself are one of these servants, and will be able to utilize anything they can, assuming it doesn't require \
opposable thumbs.</b>"
var/movement_delay_time //how long the fragment is slowed after being hit
/mob/living/simple_animal/hostile/clockwork/fragment/New()
/mob/living/simple_animal/hostile/clockwork/fragment/Initialize()
..()
SetLuminosity(2,1)
set_light(2, 0.8)
if(prob(1))
name = "anime fragment"
desc = "I-it's not like I want to show you the light of the Justiciar or anything, B-BAKA!"
/mob/living/simple_animal/hostile/clockwork/fragment/Life()
..()
if(movement_delay_time > world.time)
if(ratvar_awakens)
adjustHealth(-5)
else if(movement_delay_time > world.time)
adjustHealth(-0.2)
else
adjustHealth(-1)
@@ -46,11 +48,23 @@
/mob/living/simple_animal/hostile/clockwork/fragment/Process_Spacemove(movement_dir = 0)
return 1
/mob/living/simple_animal/hostile/clockwork/fragment/Bump(atom/movable/AM)
. = ..()
if(movement_delay_time <= world.time && next_move <= world.time && isliving(AM) && !is_servant_of_ratvar(AM))
var/mob/living/L = AM
if(L.stat) //we don't want to attack them if they're unconscious or dead because that feels REALLY BAD for the player
return
var/previousattacktext = attacktext
attacktext = "slams into"
UnarmedAttack(L)
attacktext = previousattacktext
changeNext_move(CLICK_CD_MELEE)
if(!ratvar_awakens)
adjustHealth(4)
adjust_movement_delay(10) //with the above damage, total of 20 movement delay plus speed = 0 due to damage
/mob/living/simple_animal/hostile/clockwork/fragment/emp_act(severity)
if(movement_delay_time > world.time)
movement_delay_time = movement_delay_time + (50/severity)
else
movement_delay_time = world.time + (50/severity)
adjust_movement_delay(50/severity)
/mob/living/simple_animal/hostile/clockwork/fragment/movement_delay()
. = ..()
@@ -59,11 +73,16 @@
/mob/living/simple_animal/hostile/clockwork/fragment/adjustHealth(amount)
. = ..()
if(!ratvar_awakens && amount > 0) //if ratvar is up we ignore movement delay
if(movement_delay_time > world.time)
movement_delay_time = movement_delay_time + amount*2.5
else
movement_delay_time = world.time + amount*2.5
if(amount > 0)
adjust_movement_delay(amount*2.5)
/mob/living/simple_animal/hostile/clockwork/fragment/proc/adjust_movement_delay(amount)
if(ratvar_awakens) //if ratvar is up we ignore movement delay
movement_delay_time = 0
else if(movement_delay_time > world.time)
movement_delay_time = movement_delay_time + amount
else
movement_delay_time = world.time + amount
/mob/living/simple_animal/hostile/clockwork/fragment/updatehealth()
..()
@@ -29,10 +29,10 @@
Stay near your host to protect and heal them; being too far from your host will rapidly cause you massive damage. Recall to your host if you are too weak and believe you cannot continue \
fighting safely. As a final note, you should probably avoid harming any fellow servants of Ratvar.</span>"
/mob/living/simple_animal/hostile/clockwork/marauder/New()
/mob/living/simple_animal/hostile/clockwork/marauder/Initialize()
..()
true_name = pick(possible_true_names)
SetLuminosity(2,1)
set_light(2, 1.1)
/mob/living/simple_animal/hostile/clockwork/marauder/Life()
..()
@@ -51,8 +51,8 @@
if(!recovering)
heal_host() //also heal our host if inside of them and we aren't recovering
else if(health == maxHealth)
src << "<span class='userdanger'>Your strength has returned. You can once again come forward!</span>"
host << "<span class='userdanger'>Your marauder is now strong enough to come forward again!</span>"
to_chat(src, "<span class='userdanger'>Your strength has returned. You can once again come forward!</span>")
to_chat(host, "<span class='userdanger'>Your marauder is now strong enough to come forward again!</span>")
recovering = FALSE
else
if(ratvar_awakens) //If Ratvar is alive, marauders don't need a host and are downright impossible to kill
@@ -64,7 +64,7 @@
return
if(host.stat == DEAD)
adjustHealth(50)
src << "<span class='userdanger'>Your host is dead!</span>"
to_chat(src, "<span class='userdanger'>Your host is dead!</span>")
return
if(z && host.z && z == host.z)
switch(get_dist(get_turf(src), get_turf(host)))
@@ -82,13 +82,13 @@
adjustHealth(9)
if(8 to INFINITY)
adjustHealth(15)
src << "<span class='userdanger'>You're too far from your host and rapidly taking damage!</span>"
to_chat(src, "<span class='userdanger'>You're too far from your host and rapidly taking damage!</span>")
else //right next to or on top of host
adjustHealth(-2)
heal_host() //gradually heal host if nearby and host is very weak
else //well then, you're not even in the same zlevel
adjustHealth(15)
src << "<span class='userdanger'>You're too far from your host and rapidly taking damage!</span>"
to_chat(src, "<span class='userdanger'>You're too far from your host and rapidly taking damage!</span>")
/mob/living/simple_animal/hostile/clockwork/marauder/death(gibbed)
emerge_from_host(FALSE, TRUE)
@@ -156,7 +156,7 @@
if(amount > 0)
for(var/mob/living/L in view(2, src))
if(L.is_holding_item_of_type(/obj/item/weapon/nullrod))
src << "<span class='userdanger'>The presence of a brandished holy artifact weakens your armor!</span>"
to_chat(src, "<span class='userdanger'>The presence of a brandished holy artifact weakens your armor!</span>")
amount *= 4 //if a wielded null rod is nearby, it takes four times the health damage
break
. = ..()
@@ -237,7 +237,7 @@
return ..()
/mob/living/simple_animal/hostile/clockwork/marauder/attack_animal(mob/living/simple_animal/M)
if(istype(M, /mob/living/simple_animal/hostile/clockwork/marauder) || !blockOrCounter(M, M))
if(istype(M, /mob/living/simple_animal/hostile/clockwork/marauder) || !blockOrCounter(M, M)) //we don't want infinite blockcounter loops if fighting another marauder
return ..()
/mob/living/simple_animal/hostile/clockwork/marauder/attack_paw(mob/living/carbon/monkey/M)
@@ -278,7 +278,7 @@
counterchance = initial(counterchance)
var/previousattacktext = attacktext
attacktext = "counters"
target.attack_animal(src)
UnarmedAttack(target)
attacktext = previousattacktext
else
counterchance = min(counterchance + initial(counterchance), 100)
@@ -299,19 +299,19 @@
/mob/living/simple_animal/hostile/clockwork/marauder/proc/marauder_comms(message)
var/name_part = "<span class='sevtug'>[src] ([true_name])</span>"
message = "<span class='sevtug_small'>\"[message]\"</span>" //Processed output
src << "[name_part]<span class='sevtug_small'>:</span> [message]"
host << "[name_part]<span class='sevtug_small'>:</span> [message]"
to_chat(src, "[name_part]<span class='sevtug_small'>:</span> [message]")
to_chat(host, "[name_part]<span class='sevtug_small'>:</span> [message]")
for(var/M in mob_list)
if(isobserver(M))
var/link = FOLLOW_LINK(M, src)
M << "[link] [name_part] <span class='sevtug_small'>(to</span> <span class='sevtug'>[findtextEx(host.name, host.real_name) ? "[host.name]" : "[host.real_name] (as [host.name])"]</span><span class='sevtug_small'>):</span> [message] "
to_chat(M, "[link] [name_part] <span class='sevtug_small'>(to</span> <span class='sevtug'>[findtextEx(host.name, host.real_name) ? "[host.name]" : "[host.real_name] (as [host.name])"]</span><span class='sevtug_small'>):</span> [message] ")
return TRUE
/mob/living/simple_animal/hostile/clockwork/marauder/proc/return_to_host()
if(is_in_host())
return FALSE
if(!host)
src << "<span class='warning'>You don't have a host!</span>"
to_chat(src, "<span class='warning'>You don't have a host!</span>")
return FALSE
var/resulthealth = round((host.health / host.maxHealth) * 100, 0.5)
if(iscarbon(host))
@@ -321,20 +321,20 @@
forceMove(host)
if(resulthealth > MARAUDER_EMERGE_THRESHOLD && health != maxHealth)
recovering = TRUE
src << "<span class='userdanger'>You have weakened and will need to recover before manifesting again!</span>"
host << "<span class='sevtug'>[true_name] has weakened and will need to recover before manifesting again!</span>"
to_chat(src, "<span class='userdanger'>You have weakened and will need to recover before manifesting again!</span>")
to_chat(host, "<span class='sevtug'>[true_name] has weakened and will need to recover before manifesting again!</span>")
return TRUE
/mob/living/simple_animal/hostile/clockwork/marauder/proc/try_emerge()
if(!host)
src << "<span class='warning'>You don't have a host!</span>"
to_chat(src, "<span class='warning'>You don't have a host!</span>")
return FALSE
if(!ratvar_awakens)
var/resulthealth = round((host.health / host.maxHealth) * 100, 0.5)
if(iscarbon(host))
resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - host.health) / abs(HEALTH_THRESHOLD_DEAD - host.maxHealth)) * 100)
if(host.stat != DEAD && resulthealth > MARAUDER_EMERGE_THRESHOLD) //if above 20 health, fails
src << "<span class='warning'>Your host must be at [MARAUDER_EMERGE_THRESHOLD]% or less health to emerge like this!</span>"
to_chat(src, "<span class='warning'>Your host must be at [MARAUDER_EMERGE_THRESHOLD]% or less health to emerge like this!</span>")
return FALSE
return emerge_from_host(FALSE)
@@ -343,16 +343,16 @@
return FALSE
if(!force && recovering)
if(hostchosen)
host << "<span class='sevtug'>[true_name] is too weak to come forth!</span>"
to_chat(host, "<span class='sevtug'>[true_name] is too weak to come forth!</span>")
else
host << "<span class='sevtug'>[true_name] tries to emerge to protect you, but it's too weak!</span>"
src << "<span class='userdanger'>You try to come forth, but you're too weak!</span>"
to_chat(host, "<span class='sevtug'>[true_name] tries to emerge to protect you, but it's too weak!</span>")
to_chat(src, "<span class='userdanger'>You try to come forth, but you're too weak!</span>")
return FALSE
if(!force)
if(hostchosen) //marauder approved
host << "<span class='sevtug'>Your words echo with power as [true_name] emerges from your body!</span>"
to_chat(host, "<span class='sevtug'>Your words echo with power as [true_name] emerges from your body!</span>")
else
host << "<span class='sevtug'>[true_name] emerges from your body to protect you!</span>"
to_chat(host, "<span class='sevtug'>[true_name] emerges from your body to protect you!</span>")
forceMove(host.loc)
visible_message("<span class='warning'>[host]'s skin glows red as [name] emerges from their body!</span>", "<span class='sevtug_small'>You exit the safety of [host]'s body!</span>")
return TRUE
@@ -415,14 +415,14 @@
if(!owner || !message)
return FALSE
if(!linked_marauder)
owner << "<span class='warning'>Your marauder seems to have been destroyed!</span>"
to_chat(owner, "<span class='warning'>Your marauder seems to have been destroyed!</span>")
return FALSE
var/name_part = "<span class='sevtug'>Servant [findtextEx(owner.name, owner.real_name) ? "[owner.name]" : "[owner.real_name] (as [owner.name])"]</span>"
message = "<span class='sevtug_small'>\"[message]\"</span>" //Processed output
owner << "[name_part]<span class='sevtug_small'>:</span> [message]"
linked_marauder << "[name_part]<span class='sevtug_small'>:</span> [message]"
to_chat(owner, "[name_part]<span class='sevtug_small'>:</span> [message]")
to_chat(linked_marauder, "[name_part]<span class='sevtug_small'>:</span> [message]")
for(var/M in mob_list)
if(isobserver(M))
var/link = FOLLOW_LINK(M, src)
M << "[link] [name_part] <span class='sevtug_small'>(to</span> <span class='sevtug'>[linked_marauder] ([linked_marauder.true_name])</span><span class='sevtug_small'>):</span> [message]"
to_chat(M, "[link] [name_part] <span class='sevtug_small'>(to</span> <span class='sevtug'>[linked_marauder] ([linked_marauder.true_name])</span><span class='sevtug_small'>):</span> [message]")
return TRUE
@@ -55,7 +55,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
var/successful = FALSE
if(can_recite() && has_requirements())
if(slab.busy)
invoker << "<span class='warning'>[slab] refuses to work, displaying the message: \"[slab.busy]!\"</span>"
to_chat(invoker, "<span class='warning'>[slab] refuses to work, displaying the message: \"[slab.busy]!\"</span>")
return FALSE
slab.busy = "Invocation ([name]) in progress"
if(ratvar_awakens)
@@ -96,7 +96,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
if(!invoker || !slab || invoker.get_active_held_item() != slab)
return FALSE
if(!invoker.can_speak_vocal())
invoker << "<span class='warning'>You are unable to speak the words of the scripture!</span>"
to_chat(invoker, "<span class='warning'>You are unable to speak the words of the scripture!</span>")
return FALSE
return TRUE
@@ -115,7 +115,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
failed = TRUE
if(failed)
component_printout += "</span>"
invoker << component_printout
to_chat(invoker, component_printout)
return FALSE
if(multiple_invokers_used && !multiple_invokers_optional && !ratvar_awakens && !slab.no_cost)
var/nearby_servants = 0
@@ -123,7 +123,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
if(is_servant_of_ratvar(L) && L.stat == CONSCIOUS && L.can_speak_vocal())
nearby_servants++
if(nearby_servants < invokers_required)
invoker << "<span class='warning'>There aren't enough non-mute servants nearby ([nearby_servants]/[invokers_required])!</span>"
to_chat(invoker, "<span class='warning'>There aren't enough non-mute servants nearby ([nearby_servants]/[invokers_required])!</span>")
return FALSE
if(!check_special_requirements())
return FALSE
@@ -149,7 +149,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
if(message)
if(prob(ratvarian_prob))
message = text2ratvar(message)
invoker << "<span class='[get_component_span(primary_component)]_large'>\"[message]\"</span>"
to_chat(invoker, "<span class='[get_component_span(primary_component)]_large'>\"[message]\"</span>")
invoker << 'sound/magic/clockwork/invoke_general.ogg'
return TRUE
@@ -176,7 +176,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
else
for(var/invocation in invocations)
clockwork_say(invoker, text2ratvar(invocation), whispered)
invoker << "<span class='brass'>You [channel_time <= 0 ? "recite" : "begin reciting"] a piece of scripture entitled \"[name]\".</span>"
to_chat(invoker, "<span class='brass'>You [channel_time <= 0 ? "recite" : "begin reciting"] a piece of scripture entitled \"[name]\".</span>")
if(!channel_time)
return TRUE
for(var/invocation in invocations)
@@ -219,7 +219,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
/datum/clockwork_scripture/channeled/proc/chant_effects(chant_number) //The chant's periodic effects
/datum/clockwork_scripture/channeled/proc/chant_end_effects() //The chant's effect upon ending
invoker << "<span class='brass'>You cease your chant.</span>"
to_chat(invoker, "<span class='brass'>You cease your chant.</span>")
//Creates an object at the invoker's feet
@@ -239,10 +239,10 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
/datum/clockwork_scripture/create_object/check_special_requirements()
var/turf/T = get_turf(invoker)
if(!space_allowed && isspaceturf(T))
invoker << "<span class='warning'>You need solid ground to place this object!</span>"
to_chat(invoker, "<span class='warning'>You need solid ground to place this object!</span>")
return FALSE
if(one_per_tile && (locate(prevent_path) in T))
invoker << "<span class='warning'>You can only place one of this object on each tile!</span>"
to_chat(invoker, "<span class='warning'>You can only place one of this object on each tile!</span>")
return FALSE
return TRUE
@@ -250,7 +250,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
if(creator_message && observer_message)
invoker.visible_message(observer_message, creator_message)
else if(creator_message)
invoker << creator_message
to_chat(invoker, creator_message)
var/obj/O = new object_path (get_turf(invoker))
O.ratvar_act() //update the new object so it gets buffed if ratvar is alive
if(istype(O, /obj/item))
@@ -108,7 +108,7 @@
/datum/clockwork_scripture/memory_allocation/check_special_requirements()
for(var/mob/living/simple_animal/hostile/clockwork/marauder/M in all_clockwork_mobs)
if(M.host == invoker)
invoker << "<span class='warning'>You can only house one marauder at a time!</span>"
to_chat(invoker, "<span class='warning'>You can only house one marauder at a time!</span>")
return FALSE
return TRUE
@@ -134,7 +134,7 @@
slab.busy = "Marauder Selection in progress"
if(!check_special_requirements())
return FALSE
invoker << "<span class='warning'>The tendril shivers slightly as it selects a marauder...</span>"
to_chat(invoker, "<span class='warning'>The tendril shivers slightly as it selects a marauder...</span>")
var/list/marauder_candidates = pollCandidates("Do you want to play as the clockwork marauder of [invoker.real_name]?", ROLE_SERVANT_OF_RATVAR, null, FALSE, 50)
if(!check_special_requirements())
return FALSE
@@ -214,7 +214,7 @@
quickbind_desc = "Creates an Interdiction Lens, which drains power into nearby Sigils of Transmission."
//Mending Motor: Creates a prism that will quickly heal mechanical servants/clockwork structures and consume power or replicant alloy.
//Mending Motor: Creates a prism that will quickly heal mechanical servants/clockwork structures at a power cost
/datum/clockwork_scripture/create_object/mending_motor
descname = "Powered Structure, Repairs Other Structures"
name = "Mending Motor"
@@ -285,10 +285,10 @@
if(is_servant_of_ratvar(L))
servants++
if(servants * 0.2 < clockwork_daemons)
invoker << "<span class='nezbere'>\"Daemons are already disabled, making more of them would be a waste.\"</span>"
to_chat(invoker, "<span class='nezbere'>\"Daemons are already disabled, making more of them would be a waste.\"</span>")
return FALSE
if(servants * 0.2 < clockwork_daemons+1)
invoker << "<span class='nezbere'>\"This daemon would be useless, friend.\"</span>"
to_chat(invoker, "<span class='nezbere'>\"This daemon would be useless, friend.\"</span>")
return FALSE
return ..()
@@ -18,7 +18,7 @@
/datum/clockwork_scripture/ranged_ability/linked_vanguard/check_special_requirements()
if(islist(invoker.stun_absorption) && invoker.stun_absorption["vanguard"] && invoker.stun_absorption["vanguard"]["end_time"] > world.time)
invoker << "<span class='warning'>You are already shielded by a Vanguard!</span>"
to_chat(invoker, "<span class='warning'>You are already shielded by a Vanguard!</span>")
return FALSE
return TRUE
@@ -28,9 +28,9 @@
C.apply_damage(noncultist_damage * 0.5, BURN, "r_leg")
if(C.m_intent != MOVE_INTENT_WALK)
if(!iscultist(C))
C << "<span class='warning'>Your leg[number_legs > 1 ? "s shiver":" shivers"] with pain!</span>"
to_chat(C, "<span class='warning'>Your leg[number_legs > 1 ? "s shiver":" shivers"] with pain!</span>")
else //Cultists take extra burn damage
C << "<span class='warning'>Your leg[number_legs > 1 ? "s burn":" burns"] with pain!</span>"
to_chat(C, "<span class='warning'>Your leg[number_legs > 1 ? "s burn":" burns"] with pain!</span>")
C.apply_damage(cultist_damage * 0.5, BURN, "l_leg")
C.apply_damage(cultist_damage * 0.5, BURN, "r_leg")
C.toggle_move_intent()
@@ -75,7 +75,7 @@
/datum/clockwork_scripture/vanguard/check_special_requirements()
if(islist(invoker.stun_absorption) && invoker.stun_absorption["vanguard"] && invoker.stun_absorption["vanguard"]["end_time"] > world.time)
invoker << "<span class='warning'>You are already shielded by a Vanguard!</span>"
to_chat(invoker, "<span class='warning'>You are already shielded by a Vanguard!</span>")
return FALSE
return TRUE
@@ -32,21 +32,21 @@
/datum/clockwork_scripture/create_object/ark_of_the_clockwork_justiciar/check_special_requirements()
if(!slab.no_cost)
if(ratvar_awakens)
invoker << "<span class='big_brass'>\"I am already here, idiot.\"</span>"
to_chat(invoker, "<span class='big_brass'>\"I am already here, idiot.\"</span>")
return FALSE
for(var/obj/structure/destructible/clockwork/massive/celestial_gateway/G in all_clockwork_objects)
var/area/gate_area = get_area(G)
invoker << "<span class='userdanger'>There is already a gateway at [gate_area.map_name]!</span>"
to_chat(invoker, "<span class='userdanger'>There is already a gateway at [gate_area.map_name]!</span>")
return FALSE
var/area/A = get_area(invoker)
var/turf/T = get_turf(invoker)
if(!T || T.z != ZLEVEL_STATION || istype(A, /area/shuttle) || !A.blob_allowed)
invoker << "<span class='warning'>You must be on the station to activate the Ark!</span>"
to_chat(invoker, "<span class='warning'>You must be on the station to activate the Ark!</span>")
return FALSE
if(clockwork_gateway_activated)
if(ticker && ticker.mode && ticker.mode.clockwork_objective != CLOCKCULT_GATEWAY)
invoker << "<span class='nezbere'>\"Look upon his works. Is it not glorious?\"</span>"
to_chat(invoker, "<span class='nezbere'>\"Look upon his works. Is it not glorious?\"</span>")
else
invoker << "<span class='warning'>Ratvar's recent banishment renders him too weak to be wrung forth from Reebe!</span>"
to_chat(invoker, "<span class='warning'>Ratvar's recent banishment renders him too weak to be wrung forth from Reebe!</span>")
return FALSE
return ..()
@@ -17,8 +17,8 @@
/datum/clockwork_scripture/invoke_inathneq/check_special_requirements()
if(!slab.no_cost && clockwork_generals_invoked["inath-neq"] > world.time)
invoker << "<span class='inathneq'>\"[text2ratvar("I cannot lend you my aid yet, champion. Please be careful.")]\"</span>\n\
<span class='warning'>Inath-neq has already been invoked recently! You must wait several minutes before calling upon the Resonant Cogwheel.</span>"
to_chat(invoker, "<span class='inathneq'>\"[text2ratvar("I cannot lend you my aid yet, champion. Please be careful.")]\"</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 FALSE
return TRUE
@@ -57,12 +57,12 @@
/datum/clockwork_scripture/invoke_sevtug/check_special_requirements()
if(!slab.no_cost && clockwork_generals_invoked["sevtug"] > world.time)
invoker << "<span class='sevtug'>\"[text2ratvar("Is it really so hard - even for a simpleton like you - to grasp the concept of waiting?")]\"</span>\n\
<span class='warning'>Sevtug has already been invoked recently! You must wait several minutes before calling upon the Formless Pariah.</span>"
to_chat(invoker, "<span class='sevtug'>\"[text2ratvar("Is it really so hard - even for a simpleton like you - to grasp the concept of waiting?")]\"</span>\n\
<span class='warning'>Sevtug has already been invoked recently! You must wait several minutes before calling upon the Formless Pariah.</span>")
return FALSE
if(!slab.no_cost && ratvar_awakens)
invoker << "<span class='sevtug'>\"[text2ratvar("Do you really think anything I can do right now will compare to Engine's power?")]\"</span>\n\
<span class='warning'>Sevtug will not grant his power while Ratvar's dwarfs his own!</span>"
to_chat(invoker, "<span class='sevtug'>\"[text2ratvar("Do you really think anything I can do right now will compare to Engine's power?")]\"</span>\n\
<span class='warning'>Sevtug will not grant his power while Ratvar's dwarfs his own!</span>")
return FALSE
return TRUE
@@ -81,16 +81,16 @@
var/minordistance = max(200 - distance*2, 5)
var/majordistance = max(150 - distance*3, 5)
if(H.null_rod_check())
H << "<span class='sevtug'>[text2ratvar("Oh, a void weapon. How annoying, I may as well not bother.")]</span>\n\
<span class='warning'>Your holy weapon glows a faint orange, defending your mind!</span>"
to_chat(H, "<span class='sevtug'>[text2ratvar("Oh, a void weapon. How annoying, I may as well not bother.")]</span>\n\
<span class='warning'>Your holy weapon glows a faint orange, defending your mind!</span>")
continue
else if(H.isloyal())
visualsdistance = round(visualsdistance * 0.5) //half effect for shielded targets
minordistance = round(minordistance * 0.5)
majordistance = round(majordistance * 0.5)
H << "<span class='sevtug'>[text2ratvar("Oh, look, a mindshield. Cute, I suppose I'll humor it.")]</span>"
to_chat(H, "<span class='sevtug'>[text2ratvar("Oh, look, a mindshield. Cute, I suppose I'll humor it.")]</span>")
else if(prob(visualsdistance))
H << "<span class='sevtug'>[text2ratvar(pick(mindbreaksayings))]</span>"
to_chat(H, "<span class='sevtug'>[text2ratvar(pick(mindbreaksayings))]</span>")
H.playsound_local(T, hum, visualsdistance, 1)
flash_color(H, flash_color="#AF0AAF", flash_time=visualsdistance*10)
H.dizziness = minordistance + H.dizziness
@@ -119,12 +119,12 @@
/datum/clockwork_scripture/invoke_nezbere/check_special_requirements()
if(!slab.no_cost && clockwork_generals_invoked["nezbere"] > world.time)
invoker << "<span class='nezbere'>\"[text2ratvar("Not just yet, friend. Patience is a virtue.")]\"</span>\n\
<span class='warning'>Nezbere has already been invoked recently! You must wait several minutes before calling upon the Brass Eidolon.</span>"
to_chat(invoker, "<span class='nezbere'>\"[text2ratvar("Not just yet, friend. Patience is a virtue.")]\"</span>\n\
<span class='warning'>Nezbere has already been invoked recently! You must wait several minutes before calling upon the Brass Eidolon.</span>")
return FALSE
if(!slab.no_cost && ratvar_awakens)
invoker << "<span class='nezbere'>\"[text2ratvar("Our master is here already. You do not require my help, friend.")]\"</span>\n\
<span class='warning'>There is no need for Nezbere's assistance while Ratvar is risen!</span>"
to_chat(invoker, "<span class='nezbere'>\"[text2ratvar("Our master is here already. You do not require my help, friend.")]\"</span>\n\
<span class='warning'>There is no need for Nezbere's assistance while Ratvar is risen!</span>")
return FALSE
return TRUE
@@ -159,8 +159,8 @@
/datum/clockwork_scripture/invoke_nzcrentr/check_special_requirements()
if(!slab.no_cost && clockwork_generals_invoked["nzcrentr"] > world.time)
invoker << "<span class='nzcrentr'>\"[text2ratvar("The boss says you have to wait. Hey, do you think he would mind if I killed you? ...He would? Ok.")]\"</span>\n\
<span class='warning'>Nzcrentr has already been invoked recently! You must wait several minutes before calling upon the Eternal Thunderbolt.</span>"
to_chat(invoker, "<span class='nzcrentr'>\"[text2ratvar("The boss says you have to wait. Hey, do you think he would mind if I killed you? ...He would? Ok.")]\"</span>\n\
<span class='warning'>Nzcrentr has already been invoked recently! You must wait several minutes before calling upon the Eternal Thunderbolt.</span>")
return FALSE
return TRUE
@@ -24,7 +24,7 @@
/datum/clockwork_scripture/create_object/ocular_warden/check_special_requirements()
for(var/obj/structure/destructible/clockwork/ocular_warden/W in range(OCULAR_WARDEN_EXCLUSION_RANGE, invoker))
invoker << "<span class='neovgre'>You sense another ocular warden too near this location. Placing another this close would cause them to fight.</span>" //fluff message
to_chat(invoker, "<span class='neovgre'>You sense another ocular warden too near this location. Placing another this close would cause them to fight.</span>" )
return FALSE
return ..()
@@ -146,7 +146,7 @@
/datum/clockwork_scripture/function_call/check_special_requirements()
for(var/datum/action/innate/function_call/F in invoker.actions)
invoker << "<span class='warning'>You have already bound a Ratvarian spear to yourself!</span>"
to_chat(invoker, "<span class='warning'>You have already bound a Ratvarian spear to yourself!</span>")
return FALSE
return invoker.can_hold_items()
@@ -175,13 +175,13 @@
/datum/action/innate/function_call/Activate()
if(!owner.get_empty_held_indexes())
usr << "<span class='warning'>You need an empty hand to call forth your spear!</span>"
to_chat(usr, "<span class='warning'>You need an empty hand to call forth your spear!</span>")
return FALSE
owner.visible_message("<span class='warning'>A strange spear materializes in [owner]'s hands!</span>", "<span class='brass'>You call forth your spear!</span>")
var/obj/item/clockwork/ratvarian_spear/R = new(get_turf(usr))
owner.put_in_hands(R)
if(!ratvar_awakens)
owner << "<span class='warning'>Your spear begins to break down in this plane of existence. You can't use it for long!</span>"
to_chat(owner, "<span class='warning'>Your spear begins to break down in this plane of existence. You can't use it for long!</span>")
cooldown = base_cooldown + world.time
owner.update_action_buttons_icon()
addtimer(CALLBACK(src, .proc/update_actions), base_cooldown)
@@ -212,7 +212,7 @@
/datum/clockwork_scripture/spatial_gateway/check_special_requirements()
if(!isturf(invoker.loc))
invoker << "<span class='warning'>You must not be inside an object to use this scripture!</span>"
to_chat(invoker, "<span class='warning'>You must not be inside an object to use this scripture!</span>")
return FALSE
var/other_servants = 0
for(var/mob/living/L in living_mob_list)
@@ -221,7 +221,7 @@
for(var/obj/structure/destructible/clockwork/powered/clockwork_obelisk/O in all_clockwork_objects)
other_servants++
if(!other_servants)
invoker << "<span class='warning'>There are no other servants or clockwork obelisks!</span>"
to_chat(invoker, "<span class='warning'>There are no other servants or clockwork obelisks!</span>")
return FALSE
return TRUE
@@ -284,7 +284,7 @@
invoker.visible_message("<span class='warning'>[invoker] is struck by [invoker.p_their()] own [VH.name]!</span>", "<span class='userdanger'>You're struck by your own [VH.name]!</span>")
invoker.adjustFireLoss(VH.damage) //you have to fail all five blasts to die to this
playsound(invoker, 'sound/machines/defib_zap.ogg', VH.damage, 1, -1)
invoker << "<span class='nzcrentr'>\"[text2ratvar(pick(nzcrentr_insults))]\"</span>"
to_chat(invoker, "<span class='nzcrentr'>\"[text2ratvar(pick(nzcrentr_insults))]\"</span>")
else
return FALSE
return TRUE
@@ -46,7 +46,7 @@
..()
desc = initial(desc)
if(unanchored_icon)
user << "<span class='notice'>[src] is [anchored ? "":"not "]secured to the floor.</span>"
to_chat(user, "<span class='notice'>[src] is [anchored ? "":"not "]secured to the floor.</span>")
/obj/structure/destructible/clockwork/examine_status(mob/user)
if(is_servant_of_ratvar(user) || isobserver(user))
@@ -90,7 +90,7 @@
/obj/structure/destructible/clockwork/can_be_unfasten_wrench(mob/user, silent)
if(anchored && obj_integrity <= round(max_integrity * 0.25, 1))
if(!silent)
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
to_chat(user, "<span class='warning'>[src] is too damaged to unsecure!</span>")
return FAILED_UNFASTEN
return ..()
@@ -125,7 +125,7 @@
if(do_damage)
playsound(src, break_sound, 10 * get_efficiency_mod(TRUE), 1)
take_damage(round(max_integrity * 0.25, 1), BRUTE)
user << "<span class='warning'>As you unsecure [src] from the floor, you see cracks appear in its surface!</span>"
to_chat(user, "<span class='warning'>As you unsecure [src] from the floor, you see cracks appear in its surface!</span>")
/obj/structure/destructible/clockwork/emp_act(severity)
if(anchored && unanchored_icon)
@@ -167,8 +167,8 @@
if(is_servant_of_ratvar(user) || isobserver(user))
var/powered = total_accessable_power()
var/sigil_number = LAZYLEN(check_apc_and_sigils())
user << "<span class='[powered ? "brass":"alloy"]'>It has access to <b>[powered == INFINITY ? "INFINITY":"[powered]"]W</b> of power, \
and <b>[sigil_number]</b> Sigil[sigil_number == 1 ? "":"s"] of Transmission [sigil_number == 1 ? "is":"are"] in range.</span>"
to_chat(user, "<span class='[powered ? "brass":"alloy"]'>It has access to <b>[powered == INFINITY ? "INFINITY":"[powered]"]W</b> of power, \
and <b>[sigil_number]</b> Sigil[sigil_number == 1 ? "":"s"] of Transmission [sigil_number == 1 ? "is":"are"] in range.</span>")
/obj/structure/destructible/clockwork/powered/Destroy()
SSfastprocess.processing -= src
@@ -189,7 +189,7 @@
/obj/structure/destructible/clockwork/powered/can_be_unfasten_wrench(mob/user, silent)
if(active)
if(!silent)
user << "<span class='warning'>[src] needs to be disabled before it can be unsecured!</span>"
to_chat(user, "<span class='warning'>[src] needs to be disabled before it can be unsecured!</span>")
return FAILED_UNFASTEN
return ..()
@@ -198,7 +198,7 @@
if(!is_servant_of_ratvar(user))
return FALSE
if(!anchored && !active)
user << "<span class='warning'>[src] needs to be secured to the floor before it can be activated!</span>"
to_chat(user, "<span class='warning'>[src] needs to be secured to the floor before it can be activated!</span>")
return FALSE
visible_message("<span class='notice'>[user] [active ? "dis" : "en"]ables [src].</span>", "<span class='brass'>You [active ? "dis" : "en"]able [src].</span>")
active = !active
@@ -128,11 +128,11 @@
var/obj/item/clockwork/component/C = I
if(required_components[C.component_id])
required_components[C.component_id]--
user << "<span class='notice'>You add [C] to [src].</span>"
to_chat(user, "<span class='notice'>You add [C] to [src].</span>")
user.drop_item()
qdel(C)
else
user << "<span class='notice'>[src] has enough [get_component_name(C.component_id)][C.component_id != REPLICANT_ALLOY ? "s":""].</span>"
to_chat(user, "<span class='notice'>[src] has enough [get_component_name(C.component_id)][C.component_id != REPLICANT_ALLOY ? "s":""].</span>")
return 1
else if(istype(I, /obj/item/clockwork/slab))
var/obj/item/clockwork/slab/S = I
@@ -173,34 +173,34 @@
icon_state = initial(icon_state)
if(is_servant_of_ratvar(user) || isobserver(user))
if(still_needs_components())
user << "<span class='big'><b>Components required until activation:</b></span>"
to_chat(user, "<span class='big'><b>Components required until activation:</b></span>")
for(var/i in required_components)
if(required_components[i])
user << "<span class='[get_component_span(i)]'>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</span> \
<span class='[get_component_span(i)]_large'>[required_components[i]]</span>"
to_chat(user, "<span class='[get_component_span(i)]'>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</span> \
<span class='[get_component_span(i)]_large'>[required_components[i]]</span>")
else
user << "<span class='big'><b>Seconds until [ratvar_portal ? "Ratvar's arrival":"Proselytization"]:</b> [get_arrival_text(TRUE)]</span>"
to_chat(user, "<span class='big'><b>Seconds until [ratvar_portal ? "Ratvar's arrival":"Proselytization"]:</b> [get_arrival_text(TRUE)]</span>")
switch(progress_in_seconds)
if(-INFINITY to GATEWAY_REEBE_FOUND)
user << "<span class='heavy_brass'>It's still opening.</span>"
to_chat(user, "<span class='heavy_brass'>It's still opening.</span>")
if(GATEWAY_REEBE_FOUND to GATEWAY_RATVAR_COMING)
user << "<span class='heavy_brass'>It's reached the Celestial Derelict and is drawing power from it.</span>"
to_chat(user, "<span class='heavy_brass'>It's reached the Celestial Derelict and is drawing power from it.</span>")
if(GATEWAY_RATVAR_COMING to INFINITY)
user << "<span class='heavy_brass'>[ratvar_portal ? "Ratvar is coming through the gateway":"The gateway is glowing with massed power"]!</span>"
to_chat(user, "<span class='heavy_brass'>[ratvar_portal ? "Ratvar is coming through the gateway":"The gateway is glowing with massed power"]!</span>")
else
switch(progress_in_seconds)
if(-INFINITY to GATEWAY_REEBE_FOUND)
user << "<span class='warning'>It's a swirling mass of blackness.</span>"
to_chat(user, "<span class='warning'>It's a swirling mass of blackness.</span>")
if(GATEWAY_REEBE_FOUND to GATEWAY_RATVAR_COMING)
user << "<span class='warning'>It seems to be leading somewhere.</span>"
to_chat(user, "<span class='warning'>It seems to be leading somewhere.</span>")
if(GATEWAY_RATVAR_COMING to INFINITY)
user << "<span class='boldwarning'>[ratvar_portal ? "Something is coming through":"It's glowing brightly"]!</span>"
to_chat(user, "<span class='boldwarning'>[ratvar_portal ? "Something is coming through":"It's glowing brightly"]!</span>")
/obj/structure/destructible/clockwork/massive/celestial_gateway/process()
if(!first_sound_played || prob(7))
for(var/M in player_list)
if(M && !isnewplayer(M))
M << "<span class='warning'><b>You hear otherworldly sounds from the [dir2text(get_dir(get_turf(M), get_turf(src)))]...</span>"
to_chat(M, "<span class='warning'><b>You hear otherworldly sounds from the [dir2text(get_dir(get_turf(M), get_turf(src)))]...</span>")
if(!obj_integrity)
return 0
var/convert_dist = 1 + (round(Floor(progress_in_seconds, 15) * 0.067))
@@ -315,3 +315,10 @@
pixel_x = -32
pixel_y = -32
layer = BELOW_OPEN_DOOR_LAYER
light_range = 2
light_power = 4
light_color = "#6A4D2F"
/obj/effect/clockwork/overlay/gateway_glow/New()
..()
update_light()
@@ -14,10 +14,10 @@
return 0
var/obj/item/device/mmi/posibrain/soul_vessel/S = I
if(!S.brainmob)
user << "<span class='warning'>[S] is inactive! Turn it on or capture a mind first.</span>"
to_chat(user, "<span class='warning'>[S] is inactive! Turn it on or capture a mind first.</span>")
return 0
if(S.brainmob && (!S.brainmob.client || !S.brainmob.mind))
user << "<span class='warning'>[S]'s trapped consciousness appears inactive!</span>"
to_chat(user, "<span class='warning'>[S]'s trapped consciousness appears inactive!</span>")
return 0
user.visible_message("<span class='notice'>[user] places [S] in [src], where it fuses to the shell.</span>", "<span class='brass'>You place [S] in [src], fusing it to the shell.</span>")
var/mob/living/simple_animal/A = new mobtype(get_turf(src))
@@ -24,12 +24,12 @@
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
user << "<span class='nzcrentr_small'>It requires <b>[hierophant_cost]W</b> to broadcast over the Hierophant Network, and <b>[gateway_cost]W</b> to open a Spatial Gateway.</span>"
to_chat(user, "<span class='nzcrentr_small'>It requires <b>[hierophant_cost]W</b> to broadcast over the Hierophant Network, and <b>[gateway_cost]W</b> to open a Spatial Gateway.</span>")
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/can_be_unfasten_wrench(mob/user, silent)
if(active)
if(!silent)
user << "<span class='warning'>[src] is currently sustaining a gateway!</span>"
to_chat(user, "<span class='warning'>[src] is currently sustaining a gateway!</span>")
return FAILED_UNFASTEN
return ..()
@@ -44,40 +44,40 @@
/obj/structure/destructible/clockwork/powered/clockwork_obelisk/attack_hand(mob/living/user)
if(!is_servant_of_ratvar(user) || total_accessable_power() < hierophant_cost || !anchored)
user << "<span class='warning'>You place your hand on the obelisk, but it doesn't react.</span>"
to_chat(user, "<span class='warning'>You place your hand on the obelisk, but it doesn't react.</span>")
return
var/choice = alert(user,"You place your hand on the obelisk...",,"Hierophant Broadcast","Spatial Gateway","Cancel")
switch(choice)
if("Hierophant Broadcast")
if(active)
user << "<span class='warning'>The obelisk is sustaining a gateway and cannot broadcast!</span>"
to_chat(user, "<span class='warning'>The obelisk is sustaining a gateway and cannot broadcast!</span>")
return
if(!user.can_speak_vocal())
user << "<span class='warning'>You cannot speak through the obelisk!</span>"
to_chat(user, "<span class='warning'>You cannot speak through the obelisk!</span>")
return
var/input = stripped_input(usr, "Please choose a message to send over the Hierophant Network.", "Hierophant Broadcast", "")
if(!is_servant_of_ratvar(user) || !input || !user.canUseTopic(src, !issilicon(user)))
return
if(active)
user << "<span class='warning'>The obelisk is sustaining a gateway and cannot broadcast!</span>"
to_chat(user, "<span class='warning'>The obelisk is sustaining a gateway and cannot broadcast!</span>")
return
if(!try_use_power(hierophant_cost))
user << "<span class='warning'>The obelisk lacks the power to broadcast!</span>"
to_chat(user, "<span class='warning'>The obelisk lacks the power to broadcast!</span>")
return
if(!user.can_speak_vocal())
user << "<span class='warning'>You cannot speak through the obelisk!</span>"
to_chat(user, "<span class='warning'>You cannot speak through the obelisk!</span>")
return
clockwork_say(user, text2ratvar("Hierophant Broadcast, activate! [html_decode(input)]"))
titled_hierophant_message(user, input, "big_brass", "large_brass")
if("Spatial Gateway")
if(active)
user << "<span class='warning'>The obelisk is already sustaining a gateway!</span>"
to_chat(user, "<span class='warning'>The obelisk is already sustaining a gateway!</span>")
return
if(!try_use_power(gateway_cost))
user << "<span class='warning'>The obelisk lacks the power to open a gateway!</span>"
to_chat(user, "<span class='warning'>The obelisk lacks the power to open a gateway!</span>")
return
if(!user.can_speak_vocal())
user << "<span class='warning'>You need to be able to speak to open a gateway!</span>"
to_chat(user, "<span class='warning'>You need to be able to speak to open a gateway!</span>")
return
if(procure_gateway(user, round(100 * get_efficiency_mod(), 1), round(5 * get_efficiency_mod(), 1), 1) && !active)
clockwork_say(user, text2ratvar("Spatial Gateway, activate!"))
@@ -5,6 +5,7 @@
clockwork_desc = "A binding ring around a target, preventing them from taking action while they're being converted."
max_integrity = 25
obj_integrity = 25
light_color = "#AF0AAF"
density = FALSE
immune_to_servant_attacks = TRUE
icon = 'icons/effects/clockwork_effects.dmi'
@@ -19,6 +20,10 @@
var/can_resist = FALSE
var/mob_layer = MOB_LAYER
/obj/structure/destructible/clockwork/geis_binding/New()
..()
set_light(2, 0.5)
/obj/structure/destructible/clockwork/geis_binding/examine(mob/user)
icon_state = "geisbinding_full"
..()
@@ -19,24 +19,28 @@
var/interdiction_range = 14 //how large an area it drains and disables in
var/static/list/rage_messages = list("...", "Disgusting.", "Die.", "Foul.", "Worthless.", "Mortal.", "Unfit.", "Weak.", "Fragile.", "Useless.", "Leave my sight!")
/obj/structure/destructible/clockwork/powered/interdiction_lens/New()
..()
set_light(1.4, 0.8, "#F42B9D")
/obj/structure/destructible/clockwork/powered/interdiction_lens/examine(mob/user)
..()
user << "<span class='[recharging > world.time ? "neovgre_small":"brass"]'>Its gemstone [recharging > world.time ? "has been breached by writhing tendrils of blackness that cover the totem" \
: "vibrates in place and thrums with power"].</span>"
to_chat(user, "<span class='[recharging > world.time ? "neovgre_small":"brass"]'>Its gemstone [recharging > world.time ? "has been breached by writhing tendrils of blackness that cover the totem" \
: "vibrates in place and thrums with power"].</span>")
if(is_servant_of_ratvar(user) || isobserver(user))
user << "<span class='neovgre_small'>If it fails to drain any electronics or has nothing to return power to, it will disable itself for <b>[round(recharge_time/600, 1)]</b> minutes.</span>"
to_chat(user, "<span class='neovgre_small'>If it fails to drain any electronics or has nothing to return power to, it will disable itself for <b>[round(recharge_time/600, 1)]</b> minutes.</span>")
/obj/structure/destructible/clockwork/powered/interdiction_lens/toggle(fast_process, mob/living/user)
. = ..()
if(active)
SetLuminosity(4, 2)
set_light(2, 1.6, "#EE54EE")
else
SetLuminosity(0)
set_light(1.4, 0.8, "#F42B9D")
/obj/structure/destructible/clockwork/powered/interdiction_lens/attack_hand(mob/living/user)
if(user.canUseTopic(src, !issilicon(user), NO_DEXTERY))
if(disabled)
user << "<span class='warning'>As you place your hand on the gemstone, cold tendrils of black matter crawl up your arm. You quickly pull back.</span>"
to_chat(user, "<span class='warning'>As you place your hand on the gemstone, cold tendrils of black matter crawl up your arm. You quickly pull back.</span>")
return 0
toggle(0, user)
@@ -49,7 +53,7 @@
recharging = world.time + recharge_time
flick("interdiction_lens_discharged", src)
icon_state = "interdiction_lens_inactive"
SetLuminosity(2,1)
set_light(2, 1.6, "#151200")
disabled = TRUE
return TRUE
@@ -92,7 +96,7 @@
power_drained += Floor(A.power_drain(TRUE) * efficiency, MIN_CLOCKCULT_POWER)
if(prob(1 * rage_modifier))
A << "<span class='neovgre'>\"[text2ratvar(pick(rage_messages))]\"</span>"
to_chat(A, "<span class='neovgre'>\"[text2ratvar(pick(rage_messages))]\"</span>")
if(prob(100 * (efficiency * efficiency)))
if(istype(A, /obj/machinery/camera) && unconverted_ai)
@@ -8,9 +8,10 @@
inactive_icon = "mania_motor_inactive"
unanchored_icon = "mania_motor_unwrenched"
construction_value = 20
break_message = "<span class='warning'>The antenna break off, leaving a pile of shards!</span>"
max_integrity = 100
obj_integrity = 100
break_message = "<span class='warning'>The antenna break off, leaving a pile of shards!</span>"
light_color = "#AF0AAF"
debris = list(/obj/item/clockwork/alloy_shards/large = 2, \
/obj/item/clockwork/alloy_shards/small = 2, \
/obj/item/clockwork/component/geis_capacitor/antennae = 1)
@@ -30,7 +31,7 @@
/obj/structure/destructible/clockwork/powered/mania_motor/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
user << "<span class='sevtug_small'>It requires <b>[mania_cost]W</b> to run, and at least <b>[convert_cost]W</b> to attempt to convert humans adjacent to it.</span>"
to_chat(user, "<span class='sevtug_small'>It requires <b>[mania_cost]W</b> to run, and at least <b>[convert_cost]W</b> to attempt to convert humans adjacent to it.</span>")
/obj/structure/destructible/clockwork/powered/mania_motor/forced_disable(bad_effects)
if(active)
@@ -44,16 +45,16 @@
/obj/structure/destructible/clockwork/powered/mania_motor/attack_hand(mob/living/user)
if(user.canUseTopic(src, !issilicon(user), NO_DEXTERY) && is_servant_of_ratvar(user))
if(!total_accessable_power() >= mania_cost)
user << "<span class='warning'>[src] needs more power to function!</span>"
to_chat(user, "<span class='warning'>[src] needs more power to function!</span>")
return 0
toggle(0, user)
/obj/structure/destructible/clockwork/powered/mania_motor/toggle(fast_process, mob/living/user)
. = ..()
if(active)
SetLuminosity(2, 1)
set_light(2, 0.9)
else
SetLuminosity(0)
set_light(0)
/obj/structure/destructible/clockwork/powered/mania_motor/process()
if(!try_use_power(mania_cost))
@@ -81,10 +82,10 @@
var/sound_distance = falloff_distance * 0.5
var/targetbrainloss = H.getBrainLoss()
if(distance > 3 && prob(falloff_distance * 0.5))
H << "<span class='sevtug_small'>\"[text2ratvar(pick(mania_messages))]\"</span>"
to_chat(H, "<span class='sevtug_small'>\"[text2ratvar(pick(mania_messages))]\"</span>")
if(distance <= 1)
if(!H.Adjacent(src))
H << "<span class='sevtug'>\"[text2ratvar(pick(close_messages))]\"</span>"
to_chat(H, "<span class='sevtug'>\"[text2ratvar(pick(close_messages))]\"</span>")
H.playsound_local(T, hum, sound_distance, 1)
else if(!try_use_power(convert_cost))
visible_message("<span class='warning'>[src]'s antennae fizzle quietly.</span>")
@@ -98,7 +99,7 @@
else
H.Paralyse(3)
else if(is_eligible_servant(H))
H << "<span class='sevtug'>\"[text2ratvar("You are mine and his, now.")]\"</span>"
to_chat(H, "<span class='sevtug'>\"[text2ratvar("You are mine and his, now.")]\"</span>")
add_servant_of_ratvar(H)
H.Paralyse(5)
else
@@ -107,9 +108,9 @@
if(0 to 3)
if(prob(falloff_distance * 0.5))
if(prob(falloff_distance))
H << "<span class='sevtug_small'>\"[text2ratvar(pick(mania_messages))]\"</span>"
to_chat(H, "<span class='sevtug_small'>\"[text2ratvar(pick(mania_messages))]\"</span>")
else
H << "<span class='sevtug'>\"[text2ratvar(pick(compel_messages))]\"</span>"
to_chat(H, "<span class='sevtug'>\"[text2ratvar(pick(compel_messages))]\"</span>")
if(targetbrainloss <= 40)
H.adjustBrainLoss(3 * efficiency)
H.adjust_drugginess(Clamp(7 * efficiency, 0, 50 - H.druggy))
@@ -32,7 +32,7 @@
/obj/structure/destructible/clockwork/powered/mending_motor/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
user << "<span class='inathneq_small'>It requires at least <b>[heal_cost]W</b> to attempt to repair clockwork mobs, structures, or converted silicons.</span>"
to_chat(user, "<span class='inathneq_small'>It requires at least <b>[heal_cost]W</b> to attempt to repair clockwork mobs, structures, or converted silicons.</span>")
/obj/structure/destructible/clockwork/powered/mending_motor/forced_disable(bad_effects)
if(active)
@@ -45,7 +45,7 @@
/obj/structure/destructible/clockwork/powered/mending_motor/attack_hand(mob/living/user)
if(user.canUseTopic(src, !issilicon(user), NO_DEXTERY) && is_servant_of_ratvar(user))
if(total_accessable_power() < MIN_CLOCKCULT_POWER)
user << "<span class='warning'>[src] needs more power to function!</span>"
to_chat(user, "<span class='warning'>[src] needs more power to function!</span>")
return 0
toggle(0, user)
@@ -64,10 +64,10 @@
S.adjustHealth(-(8 * efficiency))
new /obj/effect/overlay/temp/heal(T, "#1E8CE1")
else
S << "<span class='inathneq'>\"[text2ratvar(pick(heal_failure_messages))]\"</span>"
to_chat(S, "<span class='inathneq'>\"[text2ratvar(pick(heal_failure_messages))]\"</span>")
break
else
S << "<span class='inathneq'>\"[text2ratvar(pick(heal_finish_messages))]\"</span>"
to_chat(S, "<span class='inathneq'>\"[text2ratvar(pick(heal_finish_messages))]\"</span>")
break
else if(is_type_in_typecache(M, mending_motor_typecache))
T = get_turf(M)
@@ -97,10 +97,10 @@
S.heal_ordered_damage(8 * efficiency, damage_heal_order)
new /obj/effect/overlay/temp/heal(T, "#1E8CE1")
else
S << "<span class='inathneq'>\"[text2ratvar(pick(heal_failure_messages))]\"</span>"
to_chat(S, "<span class='inathneq'>\"[text2ratvar(pick(heal_failure_messages))]\"</span>")
break
else
S << "<span class='inathneq'>\"[text2ratvar(pick(heal_finish_messages))]\"</span>"
to_chat(S, "<span class='inathneq'>\"[text2ratvar(pick(heal_finish_messages))]\"</span>")
break
. = ..()
if(. < heal_cost)
@@ -27,7 +27,7 @@
/obj/structure/destructible/clockwork/ocular_warden/examine(mob/user)
..()
user << "<span class='brass'>[target ? "<b>It's fixated on [target]!</b>" : "Its gaze is wandering aimlessly."]</span>"
to_chat(user, "<span class='brass'>[target ? "<b>It's fixated on [target]!</b>" : "Its gaze is wandering aimlessly."]</span>")
/obj/structure/destructible/clockwork/ocular_warden/hulk_damage()
return 25
@@ -36,12 +36,12 @@
if(anchored)
if(obj_integrity <= max_integrity * 0.25)
if(!silent)
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
to_chat(user, "<span class='warning'>[src] is too damaged to unsecure!</span>")
return FAILED_UNFASTEN
else
for(var/obj/structure/destructible/clockwork/ocular_warden/W in orange(OCULAR_WARDEN_EXCLUSION_RANGE, src))
if(!silent)
user << "<span class='neovgre'>You sense another ocular warden too near this location. Activating this one this close would cause them to fight.</span>"
to_chat(user, "<span class='neovgre'>You sense another ocular warden too near this location. Activating this one this close would cause them to fight.</span>")
return FAILED_UNFASTEN
return SUCCESSFUL_UNFASTEN
@@ -97,10 +97,10 @@
visible_message("<span class='warning'>[src] swivels to face [target]!</span>")
if(isliving(target))
var/mob/living/L = target
L << "<span class='heavy_brass'>\"I SEE YOU!\"</span>\n<span class='userdanger'>[src]'s gaze [ratvar_awakens ? "melts you alive" : "burns you"]!</span>"
to_chat(L, "<span class='heavy_brass'>\"I SEE YOU!\"</span>\n<span class='userdanger'>[src]'s gaze [ratvar_awakens ? "melts you alive" : "burns you"]!</span>")
else if(istype(target,/obj/mecha))
var/obj/mecha/M = target
M.occupant << "<span class='heavy_brass'>\"I SEE YOU!\"</span>" //heeeellooooooo, person in mech.
to_chat(M.occupant, "<span class='heavy_brass'>\"I SEE YOU!\"</span>" )
else if(prob(0.5)) //Extremely low chance because of how fast the subsystem it uses processes
if(prob(50))
visible_message("<span class='notice'>[src][pick(idle_messages)]</span>")
@@ -113,7 +113,7 @@
var/obj/item/weapon/storage/book/bible/B = L.bible_check()
if(B)
if(!(B.resistance_flags & ON_FIRE))
L << "<span class='warning'>Your [B.name] bursts into flames!</span>"
to_chat(L, "<span class='warning'>Your [B.name] bursts into flames!</span>")
for(var/obj/item/weapon/storage/book/bible/BI in L.GetAllContents())
if(!(BI.resistance_flags & ON_FIRE))
BI.fire_act()
@@ -9,6 +9,9 @@
pixel_y = -248
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
appearance_flags = 0
light_power = 0.7
light_range = 15
light_color = rgb(190, 135, 0)
var/atom/prey //Whatever Ratvar is chasing
var/clashing = FALSE //If Ratvar is FUCKING FIGHTING WITH NAR-SIE
var/proselytize_range = 10
@@ -73,13 +76,13 @@
meals += L
if(meals.len)
prey = pick(meals)
prey << "<span class='heavy_brass'><font size=5>\"You will do.\"</font></span>\n\
<span class='userdanger'>Something very large and very malevolent begins lumbering its way towards you...</span>"
to_chat(prey, "<span class='heavy_brass'><font size=5>\"You will do.\"</font></span>\n\
<span class='userdanger'>Something very large and very malevolent begins lumbering its way towards you...</span>")
prey << 'sound/effects/ratvar_reveal.ogg'
else
if((!istype(prey, /obj/singularity/narsie) && prob(10)) || is_servant_of_ratvar(prey) || prey.z != z)
prey << "<span class='heavy_brass'><font size=5>\"How dull. Leave me.\"</font></span>\n\
<span class='userdanger'>You feel tremendous relief as a set of horrible eyes loses sight of you...</span>"
to_chat(prey, "<span class='heavy_brass'><font size=5>\"How dull. Leave me.\"</font></span>\n\
<span class='userdanger'>You feel tremendous relief as a set of horrible eyes loses sight of you...</span>")
prey = null
else
dir_to_step_in = get_dir(src, prey) //Unlike Nar-Sie, Ratvar ruthlessly chases down his target
@@ -89,8 +92,8 @@
if(clashing)
return FALSE
clashing = TRUE
world << "<span class='heavy_brass'><font size=5>\"[pick("BLOOD GOD!!!", "NAR-SIE!!!", "AT LAST, YOUR TIME HAS COME!")]\"</font></span>"
world << "<span class='cult'><font size=5>\"<b>Ratvar?! How?!</b>\"</font></span>"
to_chat(world, "<span class='heavy_brass'><font size=5>\"[pick("BLOOD GOD!!!", "NAR-SIE!!!", "AT LAST, YOUR TIME HAS COME!")]\"</font></span>")
to_chat(world, "<span class='cult'><font size=5>\"<b>Ratvar?! How?!</b>\"</font></span>")
for(var/obj/singularity/narsie/N in range(15, src))
if(N.clashing)
continue
@@ -10,6 +10,7 @@
break_message = "<span class='warning'>The cache's fire winks out before it falls in on itself!</span>"
max_integrity = 80
obj_integrity = 80
light_color = "#C2852F"
var/wall_generation_cooldown
var/turf/closed/wall/clockwork/linkedwall //if we've got a linked wall and are producing
@@ -18,7 +19,7 @@
START_PROCESSING(SSobj, src)
clockwork_caches++
update_slab_info()
SetLuminosity(2,1)
set_light(2, 0.7)
/obj/structure/destructible/clockwork/cache/Destroy()
clockwork_caches--
@@ -54,18 +55,18 @@
if(istype(I, /obj/item/clockwork/component))
var/obj/item/clockwork/component/C = I
if(!anchored)
user << "<span class='warning'>[src] needs to be secured to place [C] into it!</span>"
to_chat(user, "<span class='warning'>[src] needs to be secured to place [C] into it!</span>")
else
clockwork_component_cache[C.component_id]++
update_slab_info()
user << "<span class='notice'>You add [C] to [src].</span>"
to_chat(user, "<span class='notice'>You add [C] to [src].</span>")
user.drop_item()
qdel(C)
return 1
else if(istype(I, /obj/item/clockwork/slab))
var/obj/item/clockwork/slab/S = I
if(!anchored)
user << "<span class='warning'>[src] needs to be secured to offload your slab's components into it!</span>"
to_chat(user, "<span class='warning'>[src] needs to be secured to offload your slab's components into it!</span>")
else
for(var/i in S.stored_components)
clockwork_component_cache[i] += S.stored_components[i]
@@ -76,27 +77,34 @@
else
return ..()
/obj/structure/destructible/clockwork/cache/update_anchored(mob/user, do_damage)
..()
if(anchored)
set_light(2, 0.7)
else
set_light(0)
/obj/structure/destructible/clockwork/cache/attack_hand(mob/living/user)
..()
if(is_servant_of_ratvar(user))
if(linkedwall)
if(wall_generation_cooldown > world.time)
var/temp_time = (wall_generation_cooldown - world.time) * 0.1
user << "<span class='alloy'>[src] will produce a component in <b>[temp_time]</b> second[temp_time == 1 ? "":"s"].</span>"
to_chat(user, "<span class='alloy'>[src] will produce a component in <b>[temp_time]</b> second[temp_time == 1 ? "":"s"].</span>")
else
user << "<span class='brass'>[src] is about to produce a component!</span>"
to_chat(user, "<span class='brass'>[src] is about to produce a component!</span>")
else if(anchored)
user << "<span class='alloy'>[src] is unlinked! Construct a Clockwork Wall nearby to generate components!</span>"
to_chat(user, "<span class='alloy'>[src] is unlinked! Construct a Clockwork Wall nearby to generate components!</span>")
else
user << "<span class='alloy'>[src] needs to be secured to generate components!</span>"
to_chat(user, "<span class='alloy'>[src] needs to be secured to generate components!</span>")
/obj/structure/destructible/clockwork/cache/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
if(linkedwall)
user << "<span class='brass'>It is linked to a Clockwork Wall and will generate a component every <b>[round((CACHE_PRODUCTION_TIME * 0.1) * get_efficiency_mod(TRUE), 0.1)]</b> seconds!</span>"
to_chat(user, "<span class='brass'>It is linked to a Clockwork Wall and will generate a component every <b>[round((CACHE_PRODUCTION_TIME * 0.1) * get_efficiency_mod(TRUE), 0.1)]</b> seconds!</span>")
else
user << "<span class='alloy'>It is unlinked! Construct a Clockwork Wall nearby to generate components!</span>"
user << "<b>Stored components:</b>"
to_chat(user, "<span class='alloy'>It is unlinked! Construct a Clockwork Wall nearby to generate components!</span>")
to_chat(user, "<b>Stored components:</b>")
for(var/i in clockwork_component_cache)
user << "<span class='[get_component_span(i)]_small'><i>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</i> <b>[clockwork_component_cache[i]]</b></span>"
to_chat(user, "<span class='[get_component_span(i)]_small'><i>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</i> <b>[clockwork_component_cache[i]]</b></span>")
@@ -43,12 +43,12 @@
if(is_servant_of_ratvar(user) || isobserver(user))
if(active)
if(component_id_to_produce)
user << "<span class='[get_component_span(component_id_to_produce)]_small'>It is currently producing [get_component_name(component_id_to_produce)][component_id_to_produce != REPLICANT_ALLOY ? "s":""].</span>"
to_chat(user, "<span class='[get_component_span(component_id_to_produce)]_small'>It is currently producing [get_component_name(component_id_to_produce)][component_id_to_produce != REPLICANT_ALLOY ? "s":""].</span>")
else
user << "<span class='brass'>It is currently producing random components.</span>"
user << "<span class='nezbere_small'>It will produce a component every <b>[round((production_cooldown*0.1) * get_efficiency_mod(TRUE), 0.1)]</b> seconds and requires at least the following power for each component type:</span>"
to_chat(user, "<span class='brass'>It is currently producing random components.</span>")
to_chat(user, "<span class='nezbere_small'>It will produce a component every <b>[round((production_cooldown*0.1) * get_efficiency_mod(TRUE), 0.1)]</b> seconds and requires at least the following power for each component type:</span>")
for(var/i in clockwork_component_cache)
user << "<span class='[get_component_span(i)]_small'><i>[get_component_name(i)]:</i> <b>[get_component_cost(i)]W</b> <i>([clockwork_component_cache[i]] exist[clockwork_component_cache[i] == 1 ? "s" : ""])</i></span>"
to_chat(user, "<span class='[get_component_span(i)]_small'><i>[get_component_name(i)]:</i> <b>[get_component_cost(i)]W</b> <i>([clockwork_component_cache[i]] exist[clockwork_component_cache[i] == 1 ? "s" : ""])</i></span>")
/obj/structure/destructible/clockwork/powered/tinkerers_daemon/forced_disable(bad_effects)
if(active)
@@ -63,23 +63,23 @@
/obj/structure/destructible/clockwork/powered/tinkerers_daemon/attack_hand(mob/living/user)
if(!is_servant_of_ratvar(user))
user << "<span class='warning'>You place your hand on the daemon, but nothing happens.</span>"
to_chat(user, "<span class='warning'>You place your hand on the daemon, but nothing happens.</span>")
return
if(active)
toggle(0, user)
else
if(!anchored)
user << "<span class='warning'>[src] needs to be secured to the floor before it can be activated!</span>"
to_chat(user, "<span class='warning'>[src] needs to be secured to the floor before it can be activated!</span>")
return FALSE
var/servants = 0
for(var/mob/living/L in living_mob_list)
if(is_servant_of_ratvar(L))
servants++
if(servants * 0.2 < clockwork_daemons)
user << "<span class='nezbere'>\"There are too few servants for this daemon to work.\"</span>"
to_chat(user, "<span class='nezbere'>\"There are too few servants for this daemon to work.\"</span>")
return
if(!clockwork_caches)
user << "<span class='nezbere'>\"You require a cache for this daemon to operate. Get to it.\"</span>"
to_chat(user, "<span class='nezbere'>\"You require a cache for this daemon to operate. Get to it.\"</span>")
return
var/min_power_usable = 0
for(var/i in clockwork_component_cache)
@@ -88,7 +88,7 @@
else
min_power_usable = min(min_power_usable, get_component_cost(i))
if(total_accessable_power() < min_power_usable)
user << "<span class='nezbere'>\"You need more power to activate this daemon, friend.\"</span>"
to_chat(user, "<span class='nezbere'>\"You need more power to activate this daemon, friend.\"</span>")
return
var/choice = alert(user,"Activate Daemon...",,"Specific Component","Random Component","Cancel")
switch(choice)
@@ -105,10 +105,10 @@
if(!is_servant_of_ratvar(user) || !user.canUseTopic(src, !issilicon(user), NO_DEXTERY) || active || !clockwork_caches || servants * 0.2 < clockwork_daemons)
return
if(!component_id_to_produce)
user << "<span class='warning'>You decide not to select a component and activate the daemon.</span>"
to_chat(user, "<span class='warning'>You decide not to select a component and activate the daemon.</span>")
return
if(total_accessable_power() < get_component_cost(component_id_to_produce))
user << "<span class='warning'>There is too little power to produce this type of component!</span>"
to_chat(user, "<span class='warning'>There is too little power to produce this type of component!</span>")
return
toggle(0, user)
if("Random Component")
@@ -130,10 +130,10 @@
component_glow.color = component_color
add_overlay(component_glow)
production_time = world.time + production_cooldown //don't immediately produce when turned on after being off
SetLuminosity(2, 1)
set_light(2, 0.9, get_component_color_bright(component_id_to_produce))
else
cut_overlays()
SetLuminosity(0)
set_light(0)
/obj/structure/destructible/clockwork/powered/tinkerers_daemon/proc/get_component_cost(id)
return max(MIN_CLOCKCULT_POWER*2, (MIN_CLOCKCULT_POWER*2) * (1 + round(clockwork_component_cache[id] * 0.2)))
@@ -30,30 +30,30 @@
return 1
else if(istype(I, /obj/item/weapon/screwdriver))
if(anchored)
user << "<span class='warning'>[src] needs to be unsecured to disassemble it!</span>"
to_chat(user, "<span class='warning'>[src] needs to be unsecured to disassemble it!</span>")
else
playsound(src, I.usesound, 100, 1)
user.visible_message("<span class='warning'>[user] starts to disassemble [src].</span>", "<span class='notice'>You start to disassemble [src]...</span>")
if(do_after(user, 30*I.toolspeed, target = src) && !anchored)
user << "<span class='notice'>You disassemble [src].</span>"
to_chat(user, "<span class='notice'>You disassemble [src].</span>")
deconstruct(TRUE)
return 1
else if(istype(I, /obj/item/stack/tile/brass))
var/obj/item/stack/tile/brass/W = I
if(W.get_amount() < 1)
user << "<span class='warning'>You need one brass sheet to do this!</span>"
to_chat(user, "<span class='warning'>You need one brass sheet to do this!</span>")
return
var/turf/T = get_turf(src)
if(iswallturf(T))
user << "<span class='warning'>There is already a wall present!</span>"
to_chat(user, "<span class='warning'>There is already a wall present!</span>")
return
if(!isfloorturf(T))
user << "<span class='warning'>A floor must be present to build a [anchored ? "false ":""]wall!</span>"
to_chat(user, "<span class='warning'>A floor must be present to build a [anchored ? "false ":""]wall!</span>")
return
if(locate(/obj/structure/falsewall) in T.contents)
user << "<span class='warning'>There is already a false wall present!</span>"
to_chat(user, "<span class='warning'>There is already a false wall present!</span>")
return
user << "<span class='notice'>You start adding [W] to [src]...</span>"
to_chat(user, "<span class='notice'>You start adding [W] to [src]...</span>")
if(do_after(user, 20, target = src))
var/brass_floor = FALSE
if(istype(T, /turf/open/floor/clockwork)) //if the floor is already brass, costs less to make(conservation of masssssss)
@@ -66,7 +66,7 @@
new /obj/structure/falsewall/brass(T)
qdel(src)
else
user << "<span class='warning'>You need more brass to make a [anchored ? "false ":""]wall!</span>"
to_chat(user, "<span class='warning'>You need more brass to make a [anchored ? "false ":""]wall!</span>")
return 1
return ..()
+14 -14
View File
@@ -36,9 +36,9 @@
antag_flag = ROLE_CULTIST
restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel")
protected_jobs = list()
required_players = 10
required_enemies = 2
recommended_enemies = 2
required_players = 24
required_enemies = 4
recommended_enemies = 4
enemy_minimum_age = 14
announce_span = "cult"
@@ -49,7 +49,7 @@
var/finished = 0
var/eldergod = 1 //for the summon god objective
var/acolytes_needed = 5 //for the survive objective
var/acolytes_needed = 10 //for the survive objective
var/acolytes_survived = 0
var/datum/mind/sacrifice_target = null//The target to be sacrificed
@@ -95,7 +95,7 @@
explanation = "Free objective."
if("eldergod")
explanation = "Summon Nar-Sie by invoking the rune 'Summon Nar-Sie' with nine acolytes on it. You must do this after sacrificing your target."
cult_mind.current << "<B>Objective #[obj_count]</B>: [explanation]"
to_chat(cult_mind.current, "<B>Objective #[obj_count]</B>: [explanation]")
cult_mind.memory += "<B>Objective #[obj_count]</B>: [explanation]<BR>"
/datum/game_mode/cult/post_setup()
@@ -116,7 +116,7 @@
for(var/datum/mind/cult_mind in cultists_to_cult)
equip_cultist(cult_mind.current)
update_cult_icons_added(cult_mind)
cult_mind.current << "<span class='userdanger'>You are a member of the cult!</span>"
to_chat(cult_mind.current, "<span class='userdanger'>You are a member of the cult!</span>")
add_cultist(cult_mind, 0)
..()
@@ -125,14 +125,14 @@
return
if (mob.mind)
if (mob.mind.assigned_role == "Clown")
mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself."
to_chat(mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.")
mob.dna.remove_mutation(CLOWNMUT)
if(tome)
. += cult_give_item(/obj/item/weapon/tome, mob)
else
. += cult_give_item(/obj/item/weapon/paper/talisman/supply, mob)
mob << "These will help you start the cult on this station. Use them well, and remember - you are not the only one.</span>"
to_chat(mob, "These will help you start the cult on this station. Use them well, and remember - you are not the only one.</span>")
/datum/game_mode/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob)
var/list/slots = list(
@@ -145,10 +145,10 @@
var/item_name = initial(item_path.name)
var/where = mob.equip_in_one_of_slots(T, slots)
if(!where)
mob << "<span class='userdanger'>Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).</span>"
to_chat(mob, "<span class='userdanger'>Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).</span>")
return 0
else
mob << "<span class='danger'>You have a [item_name] in your [where]."
to_chat(mob, "<span class='danger'>You have a [item_name] in your [where].")
if(where == "backpack")
var/obj/item/weapon/storage/B = mob.back
B.orient2hud(mob)
@@ -220,11 +220,11 @@
if(!check_cult_victory())
feedback_set_details("round_end_result","win - cult win")
feedback_set("round_end_result",acolytes_survived)
world << "<span class='greentext'>The cult has succeeded! Nar-sie has snuffed out another torch in the void!</span>"
to_chat(world, "<span class='greentext'>The cult has succeeded! Nar-sie has snuffed out another torch in the void!</span>")
else
feedback_set_details("round_end_result","loss - staff stopped the cult")
feedback_set("round_end_result",acolytes_survived)
world << "<span class='redtext'>The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!</span>"
to_chat(world, "<span class='redtext'>The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!</span>")
var/text = ""
@@ -264,7 +264,7 @@
ticker.news_report = CULT_FAILURE
text += "<br><B>Objective #[obj_count]</B>: [explanation]"
world << text
to_chat(world, text)
..()
return 1
@@ -277,4 +277,4 @@
text += "<br>"
world << text
to_chat(world, text)
+3 -8
View File
@@ -24,22 +24,17 @@
return
if(!ishuman(user))
user.say("O bidai nabora se[pick("'","`")]sma!")
else
user.whisper("O bidai nabora se[pick("'","`")]sma!")
sleep(10)
if(!user)
return
if(!ishuman(user))
user.say(html_decode(message))
else
user.whisper("O bidai nabora se[pick("'","`")]sma!")
user.whisper(html_decode(message))
var/my_message = "<span class='cultitalic'><b>[(ishuman(user) ? "Acolyte" : "Construct")] [findtextEx(user.name, user.real_name) ? user.name : "[user.real_name] (as [user.name])"]:</b> [message]</span>"
for(var/mob/M in mob_list)
if(iscultist(M))
M << my_message
to_chat(M, my_message)
else if(M in dead_mob_list)
var/link = FOLLOW_LINK(M, user)
M << "[link] [my_message]"
to_chat(M, "[link] [my_message]")
log_say("[user.real_name]/[user.key] : [message]")
+27 -27
View File
@@ -30,12 +30,12 @@
..()
if(!iscultist(user))
if(!is_servant_of_ratvar(user))
user << "<span class='cultlarge'>\"I wouldn't advise that.\"</span>"
user << "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>"
to_chat(user, "<span class='cultlarge'>\"I wouldn't advise that.\"</span>")
to_chat(user, "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>")
user.Dizzy(120)
else
user << "<span class='cultlarge'>\"One of Ratvar's toys is trying to play with things [user.p_they()] shouldn't. Cute.\"</span>"
user << "<span class='userdanger'>A horrible force yanks at your arm!</span>"
to_chat(user, "<span class='cultlarge'>\"One of Ratvar's toys is trying to play with things [user.p_they()] shouldn't. Cute.\"</span>")
to_chat(user, "<span class='userdanger'>A horrible force yanks at your arm!</span>")
user.emote("scream")
user.apply_damage(30, BRUTE, pick("l_arm", "r_arm"))
user.dropItemToGround(src)
@@ -177,14 +177,14 @@
..()
if(!iscultist(user))
if(!is_servant_of_ratvar(user))
user << "<span class='cultlarge'>\"I wouldn't advise that.\"</span>"
user << "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>"
to_chat(user, "<span class='cultlarge'>\"I wouldn't advise that.\"</span>")
to_chat(user, "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>")
user.dropItemToGround(src, TRUE)
user.Dizzy(30)
user.Weaken(5)
else
user << "<span class='cultlarge'>\"Trying to use things you don't own is bad, you know.\"</span>"
user << "<span class='userdanger'>The armor squeezes at your body!</span>"
to_chat(user, "<span class='cultlarge'>\"Trying to use things you don't own is bad, you know.\"</span>")
to_chat(user, "<span class='userdanger'>The armor squeezes at your body!</span>")
user.emote("scream")
user.adjustBruteLoss(25)
user.dropItemToGround(src, TRUE)
@@ -229,14 +229,14 @@
..()
if(!iscultist(user))
if(!is_servant_of_ratvar(user))
user << "<span class='cultlarge'>\"I wouldn't advise that.\"</span>"
user << "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>"
to_chat(user, "<span class='cultlarge'>\"I wouldn't advise that.\"</span>")
to_chat(user, "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>")
user.dropItemToGround(src, TRUE)
user.Dizzy(30)
user.Weaken(5)
else
user << "<span class='cultlarge'>\"Trying to use things you don't own is bad, you know.\"</span>"
user << "<span class='userdanger'>The robes squeeze at your body!</span>"
to_chat(user, "<span class='cultlarge'>\"Trying to use things you don't own is bad, you know.\"</span>")
to_chat(user, "<span class='userdanger'>The robes squeeze at your body!</span>")
user.emote("scream")
user.adjustBruteLoss(25)
user.dropItemToGround(src, TRUE)
@@ -252,7 +252,7 @@
/obj/item/clothing/glasses/night/cultblind/equipped(mob/user, slot)
..()
if(!iscultist(user))
user << "<span class='cultlarge'>\"You want to be blind, do you?\"</span>"
to_chat(user, "<span class='cultlarge'>\"You want to be blind, do you?\"</span>")
user.dropItemToGround(src, TRUE)
user.Dizzy(30)
user.Weaken(5)
@@ -276,16 +276,16 @@
if(!iscultist(user))
user.dropItemToGround(src, TRUE)
user.Weaken(5)
user << "<span class='warning'>A powerful force shoves you away from [src]!</span>"
to_chat(user, "<span class='warning'>A powerful force shoves you away from [src]!</span>")
return
if(curselimit > 1)
user << "<span class='notice'>We have exhausted our ability to curse the shuttle.</span>"
to_chat(user, "<span class='notice'>We have exhausted our ability to curse the shuttle.</span>")
return
if(SSshuttle.emergency.mode == SHUTTLE_CALL)
var/cursetime = 1800
var/timer = SSshuttle.emergency.timeLeft(1) + cursetime
SSshuttle.emergency.setTimer(timer)
user << "<span class='danger'>You shatter the orb! A dark essence spirals into the air, then disappears.</span>"
to_chat(user, "<span class='danger'>You shatter the orb! A dark essence spirals into the air, then disappears.</span>")
playsound(user.loc, 'sound/effects/Glassbr1.ogg', 50, 1)
qdel(src)
sleep(20)
@@ -311,9 +311,9 @@
/obj/item/device/cult_shift/examine(mob/user)
..()
if(uses)
user << "<span class='cult'>It has [uses] uses remaining.</span>"
to_chat(user, "<span class='cult'>It has [uses] uses remaining.</span>")
else
user << "<span class='cult'>It seems drained.</span>"
to_chat(user, "<span class='cult'>It seems drained.</span>")
/obj/item/device/cult_shift/proc/handle_teleport_grab(turf/T, mob/user)
var/mob/living/carbon/C = user
@@ -324,12 +324,12 @@
/obj/item/device/cult_shift/attack_self(mob/user)
if(!uses || !iscarbon(user))
user << "<span class='warning'>\The [src] is dull and unmoving in your hands.</span>"
to_chat(user, "<span class='warning'>\The [src] is dull and unmoving in your hands.</span>")
return
if(!iscultist(user))
user.dropItemToGround(src, TRUE)
step(src, pick(alldirs))
user << "<span class='warning'>\The [src] flickers out of your hands, your connection to this dimension is too strong!</span>"
to_chat(user, "<span class='warning'>\The [src] flickers out of your hands, your connection to this dimension is too strong!</span>")
return
var/mob/living/carbon/C = user
@@ -353,7 +353,7 @@
playsound(destination, "sparks", 50, 1)
else
C << "<span class='danger'>The veil cannot be torn here!</span>"
to_chat(C, "<span class='danger'>The veil cannot be torn here!</span>")
/obj/item/device/flashlight/flare/culttorch
name = "void torch"
@@ -382,26 +382,26 @@
if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated())
return
if(!cultist_to_receive)
user << "<span class='cultitalic'>You require a destination!</span>"
to_chat(user, "<span class='cultitalic'>You require a destination!</span>")
log_game("Void torch failed - no target")
return
if(cultist_to_receive.stat == DEAD)
user << "<span class='cultitalic'>[cultist_to_receive] has died!</span>"
to_chat(user, "<span class='cultitalic'>[cultist_to_receive] has died!</span>")
log_game("Void torch failed - target died")
return
if(!iscultist(cultist_to_receive))
user << "<span class='cultitalic'>[cultist_to_receive] is not a follower of the Geometer!</span>"
to_chat(user, "<span class='cultitalic'>[cultist_to_receive] is not a follower of the Geometer!</span>")
log_game("Void torch failed - target was deconverted")
return
user << "<span class='cultitalic'>You ignite [A] with \the [src], turning it to ash, but through the torch's flames you see that [A] has reached [cultist_to_receive]!"
to_chat(user, "<span class='cultitalic'>You ignite [A] with \the [src], turning it to ash, but through the torch's flames you see that [A] has reached [cultist_to_receive]!")
cultist_to_receive.put_in_hands(A)
charges--
user << "\The [src] now has [charges] charge\s."
to_chat(user, "\The [src] now has [charges] charge\s.")
if(charges == 0)
qdel(src)
else
..()
user << "<span class='warning'>\The [src] can only transport items!</span>"
to_chat(user, "<span class='warning'>\The [src] can only transport items!</span>")
return
+22 -19
View File
@@ -8,9 +8,9 @@
/obj/structure/destructible/cult/examine(mob/user)
..()
user << "<span class='notice'>\The [src] is [anchored ? "":"not "]secured to the floor.</span>"
to_chat(user, "<span class='notice'>\The [src] is [anchored ? "":"not "]secured to the floor.</span>")
if((iscultist(user) || isobserver(user)) && cooldowntime > world.time)
user << "<span class='cultitalic'>The magic in [src] is too weak, [p_they()] will be ready to use again in [getETA()].</span>"
to_chat(user, "<span class='cultitalic'>The magic in [src] is too weak, [p_they()] will be ready to use again in [getETA()].</span>")
/obj/structure/destructible/cult/examine_status(mob/user)
if(iscultist(user) || isobserver(user))
@@ -28,14 +28,14 @@
M.visible_message("<span class='danger'>[M] repairs \the <b>[src]</b>.</span>", \
"<span class='cult'>You repair <b>[src]</b>, leaving [p_they()] at <b>[round(obj_integrity * 100 / max_integrity)]%</b> stability.</span>")
else
M << "<span class='cult'>You cannot repair [src], as [p_they()] [p_are()] undamaged!</span>"
to_chat(M, "<span class='cult'>You cannot repair [src], as [p_they()] [p_are()] undamaged!</span>")
else
..()
/obj/structure/destructible/cult/attackby(obj/I, mob/user, params)
if(istype(I, /obj/item/weapon/tome) && iscultist(user))
anchored = !anchored
user << "<span class='notice'>You [anchored ? "":"un"]secure \the [src] [anchored ? "to":"from"] the floor.</span>"
to_chat(user, "<span class='notice'>You [anchored ? "":"un"]secure \the [src] [anchored ? "to":"from"] the floor.</span>")
if(!anchored)
icon_state = "[initial(icon_state)]_off"
else
@@ -66,13 +66,13 @@
/obj/structure/destructible/cult/talisman/attack_hand(mob/living/user)
if(!iscultist(user))
user << "<span class='warning'>You're pretty sure you know exactly what this is used for and you can't seem to touch it.</span>"
to_chat(user, "<span class='warning'>You're pretty sure you know exactly what this is used for and you can't seem to touch it.</span>")
return
if(!anchored)
user << "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>"
to_chat(user, "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>")
return
if(cooldowntime > world.time)
user << "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>"
to_chat(user, "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>")
return
var/choice = alert(user,"You study the schematics etched into the forge...",,"Eldritch Whetstone","Zealot's Blindfold","Flask of Unholy Water")
var/pickedtype
@@ -86,25 +86,26 @@
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
cooldowntime = world.time + 2400
var/obj/item/N = new pickedtype(get_turf(src))
user << "<span class='cultitalic'>You kneel before the altar and your faith is rewarded with an [N]!</span>"
to_chat(user, "<span class='cultitalic'>You kneel before the altar and your faith is rewarded with an [N]!</span>")
/obj/structure/destructible/cult/forge
name = "daemon forge"
desc = "A forge used in crafting the unholy weapons used by the armies of Nar-Sie."
icon_state = "forge"
luminosity = 3
light_range = 3
light_color = LIGHT_COLOR_LAVA
break_message = "<span class='warning'>The force breaks apart into shards with a howling scream!</span>"
/obj/structure/destructible/cult/forge/attack_hand(mob/living/user)
if(!iscultist(user))
user << "<span class='warning'>The heat radiating from [src] pushes you back.</span>"
to_chat(user, "<span class='warning'>The heat radiating from [src] pushes you back.</span>")
return
if(!anchored)
user << "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>"
to_chat(user, "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>")
return
if(cooldowntime > world.time)
user << "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>"
to_chat(user, "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>")
return
var/choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Nar-Sien Hardsuit")
var/pickedtype
@@ -118,7 +119,7 @@
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
cooldowntime = world.time + 2400
var/obj/item/N = new pickedtype(get_turf(src))
user << "<span class='cultitalic'>You work the forge as dark knowledge guides your hands, creating [N]!</span>"
to_chat(user, "<span class='cultitalic'>You work the forge as dark knowledge guides your hands, creating [N]!</span>")
var/list/blacklisted_pylon_turfs = typecacheof(list(
@@ -132,7 +133,8 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
name = "pylon"
desc = "A floating crystal that slowly heals those faithful to Nar'Sie."
icon_state = "pylon"
luminosity = 5
light_range = 5
light_color = LIGHT_COLOR_RED
break_sound = 'sound/effects/Glassbr2.ogg'
break_message = "<span class='warning'>The blood-red crystal falls to the floor and shatters!</span>"
var/heal_delay = 25
@@ -198,18 +200,19 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
name = "archives"
desc = "A desk covered in arcane manuscripts and tomes in unknown languages. Looking at the text makes your skin crawl."
icon_state = "tomealtar"
luminosity = 1
light_range = 1.4
light_color = LIGHT_COLOR_FIRE
break_message = "<span class='warning'>The books and tomes of the archives burn into ash as the desk shatters!</span>"
/obj/structure/destructible/cult/tome/attack_hand(mob/living/user)
if(!iscultist(user))
user << "<span class='warning'>All of these books seem to be gibberish.</span>"
to_chat(user, "<span class='warning'>All of these books seem to be gibberish.</span>")
return
if(!anchored)
user << "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>"
to_chat(user, "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>")
return
if(cooldowntime > world.time)
user << "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>"
to_chat(user, "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>")
return
var/choice = alert(user,"You flip through the black pages of the archives...",,"Supply Talisman","Shuttle Curse","Veil Walker Set")
var/list/pickedtype = list()
@@ -225,7 +228,7 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
cooldowntime = world.time + 2400
for(var/N in pickedtype)
var/obj/item/D = new N(get_turf(src))
user << "<span class='cultitalic'>You summon [D] from the archives!</span>"
to_chat(user, "<span class='cultitalic'>You summon [D] from the archives!</span>")
/obj/effect/gateway
name = "gateway"
+17 -17
View File
@@ -24,10 +24,10 @@ This file contains the arcane tome files.
/obj/item/weapon/tome/examine(mob/user)
..()
if(iscultist(user) || isobserver(user))
user << "<span class='cult'>The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar-Sie.</span>"
user << "<span class='cult'>Striking a cult structure will unanchor or reanchor it.</span>"
user << "<span class='cult'>Striking another cultist with it will purge holy water from them.</span>"
user << "<span class='cult'>Striking a noncultist, however, will sear their flesh.</span>"
to_chat(user, "<span class='cult'>The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar-Sie.</span>")
to_chat(user, "<span class='cult'>Striking a cult structure will unanchor or reanchor it.</span>")
to_chat(user, "<span class='cult'>Striking another cultist with it will purge holy water from them.</span>")
to_chat(user, "<span class='cult'>Striking a noncultist, however, will sear their flesh.</span>")
/obj/item/weapon/tome/attack(mob/living/M, mob/living/user)
if(!istype(M))
@@ -36,7 +36,7 @@ This file contains the arcane tome files.
return ..()
if(iscultist(M))
if(M.reagents && M.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion
user << "<span class='cult'>You remove the taint from [M].</span>" // fucking ow
to_chat(user, "<span class='cult'>You remove the taint from [M].</span>" )
var/holy2unholy = M.reagents.get_reagent_amount("holywater")
M.reagents.del_reagent("holywater")
M.reagents.add_reagent("unholywater",holy2unholy)
@@ -52,7 +52,7 @@ This file contains the arcane tome files.
/obj/item/weapon/tome/attack_self(mob/user)
if(!iscultist(user))
user << "<span class='warning'>[src] seems full of unintelligible shapes, scribbles, and notes. Is this some sort of joke?</span>"
to_chat(user, "<span class='warning'>[src] seems full of unintelligible shapes, scribbles, and notes. Is this some sort of joke?</span>")
return
open_tome(user)
@@ -199,20 +199,20 @@ This file contains the arcane tome files.
if(ticker.mode.name == "cult")
var/datum/game_mode/cult/cult_mode = ticker.mode
if(!("eldergod" in cult_mode.cult_objectives))
user << "<span class='warning'>Nar-Sie does not wish to be summoned!</span>"
to_chat(user, "<span class='warning'>Nar-Sie does not wish to be summoned!</span>")
return
if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in sacrificed))
user << "<span class='warning'>The sacrifice is not complete. The portal would lack the power to open if you tried!</span>"
to_chat(user, "<span class='warning'>The sacrifice is not complete. The portal would lack the power to open if you tried!</span>")
return
if(!cult_mode.eldergod)
user << "<span class='cultlarge'>\"I am already here. There is no need to try to summon me now.\"</span>"
to_chat(user, "<span class='cultlarge'>\"I am already here. There is no need to try to summon me now.\"</span>")
return
if((loc.z && loc.z != ZLEVEL_STATION) || !A.blob_allowed)
user << "<span class='warning'>The Geometer is not interested in lesser locations; the station is the prize!</span>"
to_chat(user, "<span class='warning'>The Geometer is not interested in lesser locations; the station is the prize!</span>")
return
var/confirm_final = alert(user, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No")
if(confirm_final == "No")
user << "<span class='cult'>You decide to prepare further before scribing the rune.</span>"
to_chat(user, "<span class='cult'>You decide to prepare further before scribing the rune.</span>")
return
Turf = get_turf(user)
A = get_area(src)
@@ -223,7 +223,7 @@ This file contains the arcane tome files.
var/obj/structure/emergency_shield/sanguine/N = new(B)
shields += N
else
user << "<span class='warning'>Nar-Sie does not wish to be summoned!</span>"
to_chat(user, "<span class='warning'>Nar-Sie does not wish to be summoned!</span>")
return
user.visible_message("<span class='warning'>[user] [user.blood_volume ? "cuts open their arm and begins writing in their own blood":"begins sketching out a strange design"]!</span>", \
"<span class='cult'>You [user.blood_volume ? "slice open your arm and ":""]begin drawing a sigil of the Geometer.</span>")
@@ -244,26 +244,26 @@ This file contains the arcane tome files.
if(S && !QDELETED(S))
qdel(S)
var/obj/effect/rune/R = new rune_to_scribe(Turf, chosen_keyword)
user << "<span class='cult'>The [lowertext(R.cultist_name)] rune [R.cultist_desc]</span>"
to_chat(user, "<span class='cult'>The [lowertext(R.cultist_name)] rune [R.cultist_desc]</span>")
feedback_add_details("cult_runes_scribed", R.cultist_name)
/obj/item/weapon/tome/proc/check_rune_turf(turf/T, mob/user)
var/area/A = get_area(T)
if(isspaceturf(T))
user << "<span class='warning'>You cannot scribe runes in space!</span>"
to_chat(user, "<span class='warning'>You cannot scribe runes in space!</span>")
return FALSE
if(locate(/obj/effect/rune) in T)
user << "<span class='cult'>There is already a rune here.</span>"
to_chat(user, "<span class='cult'>There is already a rune here.</span>")
return FALSE
if(T.z != ZLEVEL_STATION && T.z != ZLEVEL_MINING)
user << "<span class='warning'>The veil is not weak enough here."
to_chat(user, "<span class='warning'>The veil is not weak enough here.")
return FALSE
if(istype(A, /area/shuttle))
user << "<span class='warning'>Interference from hyperspace engines disrupts the Geometer's power on shuttles.</span>"
to_chat(user, "<span class='warning'>Interference from hyperspace engines disrupts the Geometer's power on shuttles.</span>")
return FALSE
return TRUE
+61 -60
View File
@@ -48,27 +48,27 @@ To draw a rune, use an arcane tome.
/obj/effect/rune/examine(mob/user)
..()
if(iscultist(user) || user.stat == DEAD) //If they're a cultist or a ghost, tell them the effects
user << "<b>Name:</b> [cultist_name]"
user << "<b>Effects:</b> [capitalize(cultist_desc)]"
user << "<b>Required Acolytes:</b> [req_cultists_text ? "[req_cultists_text]":"[req_cultists]"]"
to_chat(user, "<b>Name:</b> [cultist_name]")
to_chat(user, "<b>Effects:</b> [capitalize(cultist_desc)]")
to_chat(user, "<b>Required Acolytes:</b> [req_cultists_text ? "[req_cultists_text]":"[req_cultists]"]")
if(req_keyword && keyword)
user << "<b>Keyword:</b> [keyword]"
to_chat(user, "<b>Keyword:</b> [keyword]")
/obj/effect/rune/attackby(obj/I, mob/user, params)
if(istype(I, /obj/item/weapon/tome) && iscultist(user))
user << "<span class='notice'>You carefully erase the [lowertext(cultist_name)] rune.</span>"
to_chat(user, "<span class='notice'>You carefully erase the [lowertext(cultist_name)] rune.</span>")
qdel(src)
return
else if(istype(I, /obj/item/weapon/nullrod))
user.say("BEGONE FOUL MAGIKS!!")
user << "<span class='danger'>You disrupt the magic of [src] with [I].</span>"
to_chat(user, "<span class='danger'>You disrupt the magic of [src] with [I].</span>")
qdel(src)
return
return
/obj/effect/rune/attack_hand(mob/living/user)
if(!iscultist(user))
user << "<span class='warning'>You aren't able to understand the words of [src].</span>"
to_chat(user, "<span class='warning'>You aren't able to understand the words of [src].</span>")
return
var/list/invokers = can_invoke(user)
if(invokers.len >= req_cultists)
@@ -81,7 +81,7 @@ To draw a rune, use an arcane tome.
if(construct_invoke || !iscultist(M)) //if you're not a cult construct we want the normal fail message
attack_hand(M)
else
M << "<span class='warning'>You are unable to invoke the rune!</span>"
to_chat(M, "<span class='warning'>You are unable to invoke the rune!</span>")
/obj/effect/rune/proc/talismanhide() //for talisman of revealing/hiding
visible_message("<span class='danger'>[src] fades away.</span>")
@@ -173,7 +173,7 @@ structure_check() searches for nearby cultist structures required for the invoca
..()
for(var/M in invokers)
var/mob/living/L = M
L << "<span class='cultitalic'><b>You feel your life force draining. The Geometer is displeased.</b></span>"
to_chat(L, "<span class='cultitalic'><b>You feel your life force draining. The Geometer is displeased.</b></span>")
L.apply_damage(30, BRUTE)
qdel(src)
@@ -204,12 +204,12 @@ structure_check() searches for nearby cultist structures required for the invoca
var/obj/item/weapon/paper/talisman/talisman_type
var/list/possible_talismans = list()
if(!papers_on_rune.len)
user << "<span class='cultitalic'>There must be a blank paper on top of [src]!</span>"
to_chat(user, "<span class='cultitalic'>There must be a blank paper on top of [src]!</span>")
fail_invoke()
log_game("Talisman Creation rune failed - no blank papers on rune")
return
if(rune_in_use)
user << "<span class='cultitalic'>[src] can only support one ritual at a time!</span>"
to_chat(user, "<span class='cultitalic'>[src] can only support one ritual at a time!</span>")
fail_invoke()
log_game("Talisman Creation rune failed - already in use")
return
@@ -225,7 +225,7 @@ structure_check() searches for nearby cultist structures required for the invoca
return
papers_on_rune = checkpapers()
if(!papers_on_rune.len)
user << "<span class='cultitalic'>There must be a blank paper on top of [src]!</span>"
to_chat(user, "<span class='cultitalic'>There must be a blank paper on top of [src]!</span>")
fail_invoke()
log_game("Talisman Creation rune failed - no blank papers on rune")
return
@@ -233,7 +233,7 @@ structure_check() searches for nearby cultist structures required for the invoca
..()
visible_message("<span class='warning'>Dark power begins to channel into the paper!</span>")
rune_in_use = 1
if(!do_after(user, 100, target = paper_to_imbue))
if(!do_after(user, initial(talisman_type.creation_time), target = paper_to_imbue))
rune_in_use = 0
return
new talisman_type(get_turf(src))
@@ -278,13 +278,13 @@ var/list/teleport_runes = list()
potential_runes[avoid_assoc_duplicate_keys(T.listkey, teleportnames)] = T
if(!potential_runes.len)
user << "<span class='warning'>There are no valid runes to teleport to!</span>"
to_chat(user, "<span class='warning'>There are no valid runes to teleport to!</span>")
log_game("Teleport rune failed - no other teleport runes")
fail_invoke()
return
if(user.z > ZLEVEL_SPACEMAX)
user << "<span class='cultitalic'>You are not in the right dimension!</span>"
to_chat(user, "<span class='cultitalic'>You are not in the right dimension!</span>")
log_game("Teleport rune failed - user in away mission")
fail_invoke()
return
@@ -298,7 +298,7 @@ var/list/teleport_runes = list()
var/turf/T = get_turf(src)
var/turf/target = get_turf(actual_selected_rune)
if(is_blocked_turf(target, TRUE))
user << "<span class='warning'>The target rune is blocked. Attempting to teleport to it would be massively unwise.</span>"
to_chat(user, "<span class='warning'>The target rune is blocked. Attempting to teleport to it would be massively unwise.</span>")
fail_invoke()
return
var/movedsomething = 0
@@ -314,7 +314,7 @@ var/list/teleport_runes = list()
if(movedsomething)
..()
visible_message("<span class='warning'>There is a sharp crack of inrushing air, and everything above the rune disappears!</span>")
user << "<span class='cult'>You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"].</span>"
to_chat(user, "<span class='cult'>You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"].</span>")
if(moveuserlater)
user.forceMove(target)
else
@@ -376,12 +376,12 @@ var/list/teleport_runes = list()
/obj/effect/rune/convert/proc/do_convert(mob/living/convertee, list/invokers)
if(invokers.len < 2)
for(var/M in invokers)
M << "<span class='warning'>You need more invokers to convert [convertee]!</span>"
to_chat(M, "<span class='warning'>You need more invokers to convert [convertee]!</span>")
log_game("Offer rune failed - tried conversion with one invoker")
return 0
if(convertee.null_rod_check())
for(var/M in invokers)
M << "<span class='warning'>Something is shielding [convertee]'s mind!</span>"
to_chat(M, "<span class='warning'>Something is shielding [convertee]'s mind!</span>")
log_game("Offer rune failed - convertee had null rod")
return 0
var/brutedamage = convertee.getBruteLoss()
@@ -395,16 +395,16 @@ var/list/teleport_runes = list()
ticker.mode.add_cultist(convertee.mind, 1)
new /obj/item/weapon/tome(get_turf(src))
convertee.mind.special_role = "Cultist"
convertee << "<span class='cultitalic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
and something evil takes root.</b></span>"
convertee << "<span class='cultitalic'><b>Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\
</b></span>"
to_chat(convertee, "<span class='cultitalic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
and something evil takes root.</b></span>")
to_chat(convertee, "<span class='cultitalic'><b>Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\
</b></span>")
return 1
/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers)
if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || is_sacrifice_target(sacrificial.mind)) && invokers.len < 3)
for(var/M in invokers)
M << "<span class='cultitalic'>[sacrificial] is too greatly linked to the world! You need three acolytes!</span>"
to_chat(M, "<span class='cultitalic'>[sacrificial] is too greatly linked to the world! You need three acolytes!</span>")
log_game("Offer rune failed - not enough acolytes and target is living or sac target")
return FALSE
var/sacrifice_fulfilled = FALSE
@@ -419,12 +419,12 @@ var/list/teleport_runes = list()
new /obj/effect/overlay/temp/cult/sac(get_turf(src))
for(var/M in invokers)
if(sacrifice_fulfilled)
M << "<span class='cultlarge'>\"Yes! This is the one I desire! You have done well.\"</span>"
to_chat(M, "<span class='cultlarge'>\"Yes! This is the one I desire! You have done well.\"</span>")
else
if(ishuman(sacrificial) || iscyborg(sacrificial))
M << "<span class='cultlarge'>\"I accept this sacrifice.\"</span>"
to_chat(M, "<span class='cultlarge'>\"I accept this sacrifice.\"</span>")
else
M << "<span class='cultlarge'>\"I accept this meager sacrifice.\"</span>"
to_chat(M, "<span class='cultlarge'>\"I accept this meager sacrifice.\"</span>")
var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src))
if(sacrificial.mind)
@@ -481,14 +481,14 @@ var/list/teleport_runes = list()
if(!cult_mode && !ignore_gamemode)
for(var/M in invokers)
M << "<span class='warning'>Nar-Sie does not respond!</span>"
to_chat(M, "<span class='warning'>Nar-Sie does not respond!</span>")
fail_invoke()
log_game("Summon Nar-Sie rune failed - gametype is not cult")
return
if(locate(/obj/singularity/narsie) in poi_list)
for(var/M in invokers)
M << "<span class='warning'>Nar-Sie is already on this plane!</span>"
to_chat(M, "<span class='warning'>Nar-Sie is already on this plane!</span>")
log_game("Summon Nar-Sie rune failed - already summoned")
return
//BEGIN THE SUMMONING
@@ -533,7 +533,7 @@ var/list/teleport_runes = list()
var/revive_number = 0
if(sacrificed.len)
revive_number = sacrificed.len - revives_used
user << "<b>Revives Remaining:</b> [revive_number]"
to_chat(user, "<b>Revives Remaining:</b> [revive_number]")
/obj/effect/rune/raise_dead/invoke(var/list/invokers)
var/turf/T = get_turf(src)
@@ -546,12 +546,12 @@ var/list/teleport_runes = list()
if(iscultist(M) && M.stat == DEAD)
potential_revive_mobs |= M
if(!potential_revive_mobs.len)
user << "<span class='cultitalic'>There are no dead cultists on the rune!</span>"
to_chat(user, "<span class='cultitalic'>There are no dead cultists on the rune!</span>")
log_game("Raise Dead rune failed - no corpses to revive")
fail_invoke()
return
if(!sacrificed.len || sacrificed.len <= revives_used)
user << "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>"
to_chat(user, "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>")
fail_invoke()
return
if(potential_revive_mobs.len > 1)
@@ -569,7 +569,7 @@ var/list/teleport_runes = list()
revives_used++
mob_to_revive.revive(1, 1) //This does remove disabilities and such, but the rune might actually see some use because of it!
mob_to_revive.grab_ghost()
mob_to_revive << "<span class='cultlarge'>\"PASNAR SAVRAE YAM'TOTH. Arise.\"</span>"
to_chat(mob_to_revive, "<span class='cultlarge'>\"PASNAR SAVRAE YAM'TOTH. Arise.\"</span>")
mob_to_revive.visible_message("<span class='warning'>[mob_to_revive] draws in a huge breath, red light shining from [mob_to_revive.p_their()] eyes.</span>", \
"<span class='cultlarge'>You awaken suddenly from the void. You're alive!</span>")
rune_in_use = 0
@@ -584,18 +584,18 @@ var/list/teleport_runes = list()
fail_invoke()
return 0
if(!(target_mob in T.contents))
user << "<span class='cultitalic'>The cultist to revive has been moved!</span>"
to_chat(user, "<span class='cultitalic'>The cultist to revive has been moved!</span>")
fail_invoke()
log_game("Raise Dead rune failed - revival target moved")
return 0
var/mob/dead/observer/ghost = target_mob.get_ghost(TRUE)
if(!ghost && (!target_mob.mind || !target_mob.mind.active))
user << "<span class='cultitalic'>The corpse to revive has no spirit!</span>"
to_chat(user, "<span class='cultitalic'>The corpse to revive has no spirit!</span>")
fail_invoke()
log_game("Raise Dead rune failed - revival target has no ghost")
return 0
if(!sacrificed.len || sacrificed.len <= revives_used)
user << "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>"
to_chat(user, "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>")
fail_invoke()
log_game("Raise Dead rune failed - too few sacrificed")
return 0
@@ -625,16 +625,16 @@ var/list/teleport_runes = list()
if(1 to 2)
playsound(E, 'sound/items/Welder2.ogg', 25, 1)
for(var/M in invokers)
M << "<span class='warning'>You feel a minute vibration pass through you...</span>"
to_chat(M, "<span class='warning'>You feel a minute vibration pass through you...</span>")
if(3 to 6)
playsound(E, 'sound/magic/Disable_Tech.ogg', 50, 1)
for(var/M in invokers)
M << "<span class='danger'>Your hair stands on end as a shockwave eminates from the rune!</span>"
to_chat(M, "<span class='danger'>Your hair stands on end as a shockwave eminates from the rune!</span>")
if(7 to INFINITY)
playsound(E, 'sound/magic/Disable_Tech.ogg', 100, 1)
for(var/M in invokers)
var/mob/living/L = M
L << "<span class='userdanger'>You chant in unison and a colossal burst of energy knocks you backward!</span>"
to_chat(L, "<span class='userdanger'>You chant in unison and a colossal burst of energy knocks you backward!</span>")
L.Weaken(2)
qdel(src) //delete before pulsing because it's a delay reee
empulse(E, 9*invokers.len, 12*invokers.len) // Scales now, from a single room to most of the station depending on # of chanters
@@ -653,16 +653,16 @@ var/list/teleport_runes = list()
/obj/effect/rune/astral/examine(mob/user)
..()
if(affecting)
user << "<span class='cultitalic'>A translucent field encases [user] above the rune!</span>"
to_chat(user, "<span class='cultitalic'>A translucent field encases [user] above the rune!</span>")
/obj/effect/rune/astral/can_invoke(mob/living/user)
if(rune_in_use)
user << "<span class='cultitalic'>[src] cannot support more than one body!</span>"
to_chat(user, "<span class='cultitalic'>[src] cannot support more than one body!</span>")
log_game("Astral Communion rune failed - more than one user")
return list()
var/turf/T = get_turf(src)
if(!(user in T))
user << "<span class='cultitalic'>You must be standing on top of [src]!</span>"
to_chat(user, "<span class='cultitalic'>You must be standing on top of [src]!</span>")
log_game("Astral Communion rune failed - user not standing on rune")
return list()
return ..()
@@ -699,13 +699,13 @@ var/list/teleport_runes = list()
if(user.stat == UNCONSCIOUS)
if(prob(1))
var/mob/dead/observer/G = user.get_ghost()
G << "<span class='cultitalic'>You feel the link between you and your body weakening... you must hurry!</span>"
to_chat(G, "<span class='cultitalic'>You feel the link between you and your body weakening... you must hurry!</span>")
if(user.stat == DEAD)
user.color = initial(user.color)
rune_in_use = 0
affecting = null
var/mob/dead/observer/G = user.get_ghost()
G << "<span class='cultitalic'><b>You suddenly feel your physical form pass on. [src]'s exertion has killed you!</b></span>"
to_chat(G, "<span class='cultitalic'><b>You suddenly feel your physical form pass on. [src]'s exertion has killed you!</b></span>")
return
sleep(1)
rune_in_use = 0
@@ -730,7 +730,7 @@ var/list/wall_runes = list()
/obj/effect/rune/wall/examine(mob/user)
..()
if(density)
user << "<span class='cultitalic'>There is a barely perceptible shimmering of the air above [src].</span>"
to_chat(user, "<span class='cultitalic'>There is a barely perceptible shimmering of the air above [src].</span>")
/obj/effect/rune/wall/Destroy()
density = 0
@@ -813,22 +813,22 @@ var/list/wall_runes = list()
if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated())
return
if(!cultist_to_summon)
user << "<span class='cultitalic'>You require a summoning target!</span>"
to_chat(user, "<span class='cultitalic'>You require a summoning target!</span>")
fail_invoke()
log_game("Summon Cultist rune failed - no target")
return
if(cultist_to_summon.stat == DEAD)
user << "<span class='cultitalic'>[cultist_to_summon] has died!</span>"
to_chat(user, "<span class='cultitalic'>[cultist_to_summon] has died!</span>")
fail_invoke()
log_game("Summon Cultist rune failed - target died")
return
if(!iscultist(cultist_to_summon))
user << "<span class='cultitalic'>[cultist_to_summon] is not a follower of the Geometer!</span>"
to_chat(user, "<span class='cultitalic'>[cultist_to_summon] is not a follower of the Geometer!</span>")
fail_invoke()
log_game("Summon Cultist rune failed - target was deconverted")
return
if(cultist_to_summon.z > ZLEVEL_SPACEMAX)
user << "<span class='cultitalic'>[cultist_to_summon] is not in our dimension!</span>"
to_chat(user, "<span class='cultitalic'>[cultist_to_summon] is not in our dimension!</span>")
fail_invoke()
log_game("Summon Cultist rune failed - target in away mission")
return
@@ -847,6 +847,7 @@ var/list/wall_runes = list()
invocation = "Dedo ol'btoh!"
icon_state = "4"
color = "#C80000"
light_color = LIGHT_COLOR_LAVA
req_cultists = 3
construct_invoke = 0
var/tick_damage = 25
@@ -862,21 +863,21 @@ var/list/wall_runes = list()
rune_in_use = TRUE
var/turf/T = get_turf(src)
visible_message("<span class='warning'>[src] turns a bright, glowing orange!</span>")
SetLuminosity(6)
set_light(6)
color = "#FC9B54"
for(var/M in invokers)
var/mob/living/L = M
L.apply_damage(10, BRUTE, pick("l_arm", "r_arm"))
L << "<span class='cultitalic'>[src] saps your strength!</span>"
to_chat(L, "<span class='cultitalic'>[src] saps your strength!</span>")
for(var/mob/living/L in viewers(T))
if(!iscultist(L) && L.blood_volume)
var/obj/item/weapon/nullrod/N = L.null_rod_check()
if(N)
L << "<span class='userdanger'>\The [N] suddenly burns hotly before returning to normal!</span>"
to_chat(L, "<span class='userdanger'>\The [N] suddenly burns hotly before returning to normal!</span>")
continue
L << "<span class='cultlarge'>Your blood boils in your veins!</span>"
to_chat(L, "<span class='cultlarge'>Your blood boils in your veins!</span>")
if(is_servant_of_ratvar(L))
L << "<span class='userdanger'>You feel an unholy darkness dimming the Justiciar's light!</span>"
to_chat(L, "<span class='userdanger'>You feel an unholy darkness dimming the Justiciar's light!</span>")
animate(src, color = "#FCB56D", time = 4)
sleep(4)
if(!src)
@@ -923,7 +924,7 @@ var/list/wall_runes = list()
if(M.stat != DEAD)
potential_targets += M
if(!potential_targets.len)
user << "<span class='cultitalic'>There must be at least one valid target on the rune!</span>"
to_chat(user, "<span class='cultitalic'>There must be at least one valid target on the rune!</span>")
log_game("Leeching rune failed - no valid targets")
return list()
return ..()
@@ -938,7 +939,7 @@ var/list/wall_runes = list()
var/drained_amount = rand(10,20)
M.apply_damage(drained_amount, BRUTE, "chest")
user.adjustBruteLoss(-drained_amount)
M << "<span class='cultitalic'>You feel extremely weak.</span>"
to_chat(M, "<span class='cultitalic'>You feel extremely weak.</span>")
user.Beam(T,icon_state="drainbeam",time=5)
user.visible_message("<span class='warning'>Blood flows from the rune into [user]!</span>", \
"<span class='cult'>Blood flows into you, healing your wounds and revitalizing your spirit.</span>")
@@ -959,7 +960,7 @@ var/list/wall_runes = list()
/obj/effect/rune/manifest/can_invoke(mob/living/user)
if(!(user in get_turf(src)))
user << "<span class='cultitalic'>You must be standing on [src]!</span>"
to_chat(user, "<span class='cultitalic'>You must be standing on [src]!</span>")
fail_invoke()
log_game("Manifest rune failed - user not standing on rune")
return list()
@@ -968,7 +969,7 @@ var/list/wall_runes = list()
if(O.client && !jobban_isbanned(O, ROLE_CULTIST))
ghosts_on_rune |= O
if(!ghosts_on_rune.len)
user << "<span class='cultitalic'>There are no spirits near [src]!</span>"
to_chat(user, "<span class='cultitalic'>There are no spirits near [src]!</span>")
fail_invoke()
log_game("Manifest rune failed - no nearby ghosts")
return list()
@@ -986,13 +987,13 @@ var/list/wall_runes = list()
new_human.alpha = 150 //Makes them translucent
..()
visible_message("<span class='warning'>A cloud of red mist forms above [src], and from within steps... a man.</span>")
user << "<span class='cultitalic'>Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...</span>"
to_chat(user, "<span class='cultitalic'>Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...</span>")
var/turf/T = get_turf(src)
var/obj/structure/emergency_shield/invoker/N = new(T)
new_human.key = ghost_to_spawn.key
ticker.mode.add_cultist(new_human.mind, 0)
new_human << "<span class='cultitalic'><b>You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar-Sie, and you are to serve them at all costs.</b></span>"
to_chat(new_human, "<span class='cultitalic'><b>You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar-Sie, and you are to serve them at all costs.</b></span>")
while(user in T)
if(user.stat)
+34 -26
View File
@@ -4,18 +4,19 @@
var/invocation = "Naise meam!"
var/uses = 1
var/health_cost = 0 //The amount of health taken from the user when invoking the talisman
var/creation_time = 100 //how long it takes an imbue rune to make this type of talisman
/obj/item/weapon/paper/talisman/examine(mob/user)
if(iscultist(user) || user.stat == DEAD)
user << "<b>Name:</b> [cultist_name]"
user << "<b>Effect:</b> [cultist_desc]"
user << "<b>Uses Remaining:</b> [uses]"
to_chat(user, "<b>Name:</b> [cultist_name]")
to_chat(user, "<b>Effect:</b> [cultist_desc]")
to_chat(user, "<b>Uses Remaining:</b> [uses]")
else
user << "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>"
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
/obj/item/weapon/paper/talisman/attack_self(mob/living/user)
if(!iscultist(user))
user << "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>"
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
return
if(invoke(user))
uses--
@@ -39,7 +40,7 @@
invocation = "Ra'sha yoka!"
/obj/item/weapon/paper/talisman/malformed/invoke(mob/living/user, successfuluse = 1)
user << "<span class='cultitalic'>You feel a pain in your head. The Geometer is displeased.</span>"
to_chat(user, "<span class='cultitalic'>You feel a pain in your head. The Geometer is displeased.</span>")
if(iscarbon(user))
var/mob/living/carbon/C = user
C.apply_damage(10, BRUTE, "head")
@@ -119,6 +120,7 @@
color = "#551A8B" // purple
invocation = "Sas'so c'arta forbici!"
health_cost = 5
creation_time = 80
/obj/item/weapon/paper/talisman/teleport/invoke(mob/living/user, successfuluse = 1)
var/list/potential_runes = list()
@@ -128,12 +130,12 @@
potential_runes[avoid_assoc_duplicate_keys(T.listkey, teleportnames)] = T
if(!potential_runes.len)
user << "<span class='warning'>There are no valid runes to teleport to!</span>"
to_chat(user, "<span class='warning'>There are no valid runes to teleport to!</span>")
log_game("Teleport talisman failed - no other teleport runes")
return ..(user, 0)
if(user.z > ZLEVEL_SPACEMAX)
user << "<span class='cultitalic'>You are not in the right dimension!</span>"
to_chat(user, "<span class='cultitalic'>You are not in the right dimension!</span>")
log_game("Teleport talisman failed - user in away mission")
return ..(user, 0)
@@ -143,7 +145,7 @@
return ..(user, 0)
var/turf/target = get_turf(actual_selected_rune)
if(is_blocked_turf(target, TRUE))
user << "<span class='warning'>The target rune is blocked. Attempting to teleport to it would be massively unwise.</span>"
to_chat(user, "<span class='warning'>The target rune is blocked. Attempting to teleport to it would be massively unwise.</span>")
return ..(user, 0)
user.visible_message("<span class='warning'>Dust flows from [user]'s hand, and [user.p_they()] disappear in a flash of red light!</span>", \
"<span class='cultitalic'>You speak the words of the talisman and find yourself somewhere else!</span>")
@@ -157,6 +159,7 @@
color = "#512727" // red-black
invocation = "N'ath reth sh'yro eth d'raggathnor!"
health_cost = 1
creation_time = 30
/obj/item/weapon/paper/talisman/summon_tome/invoke(mob/living/user, successfuluse = 1)
. = ..()
@@ -172,6 +175,7 @@
color = "#9c9c9c" // grey
invocation = "Kla'atu barada nikt'o!"
health_cost = 1
creation_time = 30
uses = 2
var/revealing = FALSE //if it reveals or not
@@ -196,6 +200,7 @@
cultist_desc = "A talisman that will make nearby runes appear fake."
color = "#ff80d5" // honk
invocation = "By'o nar'nar!"
creation_time = 20
/obj/item/weapon/paper/talisman/make_runes_fake/invoke(mob/living/user, successfuluse = 1)
. = ..()
@@ -232,9 +237,9 @@
if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff
return ..()
if(iscultist(user))
user << "<span class='warning'>To use this talisman, attack the target directly.</span>"
to_chat(user, "<span class='warning'>To use this talisman, attack the target directly.</span>")
else
user << "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>"
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
return 0
/obj/item/weapon/paper/talisman/stun/attack(mob/living/target, mob/living/user, successfuluse = 1)
@@ -273,6 +278,7 @@
cultist_desc = "A talisman that will equip the invoker with cultist equipment if there is a slot to equip it to."
color = "#33cc33" // green
invocation = "N'ath reth sh'yro eth draggathnor!"
creation_time = 80
/obj/item/weapon/paper/talisman/armor/invoke(mob/living/user, successfuluse = 1)
. = ..()
@@ -301,15 +307,16 @@
cultist_desc = "A talisman that will break the mind of the victim with nightmarish hallucinations."
color = "#ffb366" // light orange
invocation = "Lo'Nab Na'Dm!"
creation_time = 80
/obj/item/weapon/paper/talisman/horror/attack(mob/living/target, mob/living/user)
if(iscultist(user))
user << "<span class='cultitalic'>You disturb [target] with visons of the end!</span>"
to_chat(user, "<span class='cultitalic'>You disturb [target] with visons of the end!</span>")
if(iscarbon(target))
var/mob/living/carbon/H = target
H.reagents.add_reagent("mindbreaker", 25)
if(is_servant_of_ratvar(target))
target << "<span class='userdanger'>You see a brief but horrible vision of Ratvar, rusted and scrapped, being torn apart.</span>"
to_chat(target, "<span class='userdanger'>You see a brief but horrible vision of Ratvar, rusted and scrapped, being torn apart.</span>")
target.emote("scream")
target.confused = max(0, target.confused + 3)
target.flash_act()
@@ -323,17 +330,18 @@
invocation = "Ethra p'ni dedol!"
color = "#000000" // black
uses = 25
creation_time = 80
/obj/item/weapon/paper/talisman/construction/attack_self(mob/living/user)
if(iscultist(user))
user << "<span class='warning'>To use this talisman, place it upon a stack of metal sheets.</span>"
to_chat(user, "<span class='warning'>To use this talisman, place it upon a stack of metal sheets.</span>")
else
user << "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>"
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
/obj/item/weapon/paper/talisman/construction/attack(obj/M,mob/living/user)
if(iscultist(user))
user << "<span class='cultitalic'>This talisman will only work on a stack of metal or plasteel sheets!</span>"
to_chat(user, "<span class='cultitalic'>This talisman will only work on a stack of metal or plasteel sheets!</span>")
log_game("Construct talisman failed - not a valid target")
else
..()
@@ -345,24 +353,24 @@
if(istype(target, /obj/item/stack/sheet/metal))
if(target.use(25))
new /obj/structure/constructshell(T)
user << "<span class='warning'>The talisman clings to the metal and twists it into a construct shell!</span>"
to_chat(user, "<span class='warning'>The talisman clings to the metal and twists it into a construct shell!</span>")
user << sound('sound/effects/magic.ogg',0,1,25)
invoke(user, 1)
qdel(src)
else
user << "<span class='warning'>You need more metal to produce a construct shell!</span>"
to_chat(user, "<span class='warning'>You need more metal to produce a construct shell!</span>")
else if(istype(target, /obj/item/stack/sheet/plasteel))
var/quantity = min(target.amount, uses)
uses -= quantity
new /obj/item/stack/sheet/runed_metal(T,quantity)
target.use(quantity)
user << "<span class='warning'>The talisman clings to the plasteel, transforming it into runed metal!</span>"
to_chat(user, "<span class='warning'>The talisman clings to the plasteel, transforming it into runed metal!</span>")
user << sound('sound/effects/magic.ogg',0,1,25)
invoke(user, 1)
if(uses <= 0)
qdel(src)
else
user << "<span class='warning'>The talisman must be used on metal or plasteel!</span>"
to_chat(user, "<span class='warning'>The talisman must be used on metal or plasteel!</span>")
//Talisman of Shackling: Applies special cuffs directly from the talisman
@@ -377,9 +385,9 @@
if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff
return ..()
if(iscultist(user))
user << "<span class='warning'>To use this talisman, attack the target directly.</span>"
to_chat(user, "<span class='warning'>To use this talisman, attack the target directly.</span>")
else
user << "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>"
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
return 0
/obj/item/weapon/paper/talisman/shackle/attack(mob/living/carbon/target, mob/living/user)
@@ -401,15 +409,15 @@
if(!C.handcuffed)
C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/cult/used(C)
C.update_handcuffed()
user << "<span class='notice'>You shackle [C].</span>"
to_chat(user, "<span class='notice'>You shackle [C].</span>")
add_logs(user, C, "handcuffed")
uses--
else
user << "<span class='warning'>[C] is already bound.</span>"
to_chat(user, "<span class='warning'>[C] is already bound.</span>")
else
user << "<span class='warning'>You fail to shackle [C].</span>"
to_chat(user, "<span class='warning'>You fail to shackle [C].</span>")
else
user << "<span class='warning'>[C] is already bound.</span>"
to_chat(user, "<span class='warning'>[C] is already bound.</span>")
if(uses <= 0)
user.drop_item()
qdel(src)
+1 -1
View File
@@ -51,7 +51,7 @@
/datum/game_mode/devil/post_setup()
for(var/datum/mind/devil in devils)
spawn(rand(10,100))
finalize_devil(devil, objective_count)
finalize_devil(devil, TRUE)
spawn(100)
add_devil_objectives(devil, objective_count) //This has to be in a separate loop, as we need devil names to be generated before we give objectives in devil agent.
devil.announceDevilLaws()
+64 -61
View File
@@ -94,6 +94,7 @@ var/global/list/lawlorify = list (
/obj/effect/proc_holder/spell/targeted/summon_contract,
/obj/effect/proc_holder/spell/targeted/conjure_item/violin,
/obj/effect/proc_holder/spell/targeted/summon_dancefloor)
var/ascendable = FALSE
/datum/devilinfo/New()
@@ -156,11 +157,11 @@ var/global/list/lawlorify = list (
return
soulsOwned += soul
owner.current.nutrition = NUTRITION_LEVEL_FULL
owner.current << "<span class='warning'>You feel satiated as you received a new soul.</span>"
to_chat(owner.current, "<span class='warning'>You feel satiated as you received a new soul.</span>")
update_hud()
switch(SOULVALUE)
if(0)
owner.current << "<span class='warning'>Your hellish powers have been restored."
to_chat(owner.current, "<span class='warning'>Your hellish powers have been restored.")
give_base_spells()
if(BLOOD_THRESHOLD)
increase_blood_lizard()
@@ -172,7 +173,7 @@ var/global/list/lawlorify = list (
/datum/devilinfo/proc/remove_soul(datum/mind/soul)
if(soulsOwned.Remove(soul))
check_regression()
owner.current << "<span class='warning'>You feel as though a soul has slipped from your grasp.</span>"
to_chat(owner.current, "<span class='warning'>You feel as though a soul has slipped from your grasp.</span>")
update_hud()
/datum/devilinfo/proc/check_regression()
@@ -185,19 +186,10 @@ var/global/list/lawlorify = list (
regress_humanoid()
if(SOULVALUE < 0)
remove_spells()
owner.current << "<span class='warning'>As punishment for your failures, all of your powers except contract creation have been revoked."
/datum/devilinfo/proc/increase_form()
switch(form)
if(BASIC_DEVIL)
increase_blood_lizard()
if(BLOOD_LIZARD)
increase_true_devil()
if(TRUE_DEVIL)
increase_arch_devil()
to_chat(owner.current, "<span class='warning'>As punishment for your failures, all of your powers except contract creation have been revoked.")
/datum/devilinfo/proc/regress_humanoid()
owner.current << "<span class='warning'>Your powers weaken, have more contracts be signed to regain power."
to_chat(owner.current, "<span class='warning'>Your powers weaken, have more contracts be signed to regain power.")
if(ishuman(owner.current))
var/mob/living/carbon/human/H = owner.current
H.set_species(/datum/species/human, 1)
@@ -209,7 +201,7 @@ var/global/list/lawlorify = list (
/datum/devilinfo/proc/regress_blood_lizard()
var/mob/living/carbon/true_devil/D = owner.current
D << "<span class='warning'>Your powers weaken, have more contracts be signed to regain power."
to_chat(D, "<span class='warning'>Your powers weaken, have more contracts be signed to regain power.")
D.oldform.loc = D.loc
owner.transfer_to(D.oldform)
give_lizard_spells()
@@ -219,7 +211,7 @@ var/global/list/lawlorify = list (
/datum/devilinfo/proc/increase_blood_lizard()
owner.current << "<span class='warning'>You feel as though your humanoid form is about to shed. You will soon turn into a blood lizard."
to_chat(owner.current, "<span class='warning'>You feel as though your humanoid form is about to shed. You will soon turn into a blood lizard.")
sleep(50)
if(ishuman(owner.current))
var/mob/living/carbon/human/H = owner.current
@@ -237,7 +229,7 @@ var/global/list/lawlorify = list (
/datum/devilinfo/proc/increase_true_devil()
owner.current << "<span class='warning'>You feel as though your current form is about to shed. You will soon turn into a true devil."
to_chat(owner.current, "<span class='warning'>You feel as though your current form is about to shed. You will soon turn into a true devil.")
sleep(50)
var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(owner.current.loc)
A.faction |= "hell"
@@ -251,8 +243,10 @@ var/global/list/lawlorify = list (
/datum/devilinfo/proc/increase_arch_devil()
if(!ascendable)
return
var/mob/living/carbon/true_devil/D = owner.current
D << "<span class='warning'>You feel as though your form is about to ascend."
to_chat(D, "<span class='warning'>You feel as though your form is about to ascend.")
sleep(50)
if(!D)
return
@@ -271,19 +265,19 @@ var/global/list/lawlorify = list (
sleep(40)
if(!D)
return
D << "<i><b>Yes!</b></i>"
to_chat(D, "<i><b>Yes!</b></i>")
sleep(10)
if(!D)
return
D << "<i><b><span class='big'>YES!!</span></b></i>"
to_chat(D, "<i><b><span class='big'>YES!!</span></b></i>")
sleep(10)
if(!D)
return
D << "<i><b><span class='reallybig'>YE--</span></b></i>"
to_chat(D, "<i><b><span class='reallybig'>YE--</span></b></i>")
sleep(1)
if(!D)
return
world << "<font size=5><span class='danger'><b>\"SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!\"</font></span>"
to_chat(world, "<font size=5><span class='danger'><b>\"SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!\"</font></span>")
world << 'sound/hallucinations/veryfar_noise.ogg'
give_arch_spells()
D.convert_to_archdevil()
@@ -339,23 +333,23 @@ var/global/list/lawlorify = list (
/datum/devilinfo/proc/beginResurrectionCheck(mob/living/body)
if(SOULVALUE>0)
owner.current<< "<span class='userdanger'>Your body has been damaged to the point that you may no longer use it. At the cost of some of your power, you will return to life soon. Remain in your body.</span>"
to_chat(owner.current, "<span class='userdanger'>Your body has been damaged to the point that you may no longer use it. At the cost of some of your power, you will return to life soon. Remain in your body.</span>")
sleep(DEVILRESURRECTTIME)
if (!body || body.stat == DEAD)
if(SOULVALUE>0)
if(check_banishment(body))
owner.current<< "<span class='userdanger'>Unfortunately, the mortals have finished a ritual that prevents your resurrection.</span>"
to_chat(owner.current, "<span class='userdanger'>Unfortunately, the mortals have finished a ritual that prevents your resurrection.</span>")
return -1
else
owner.current<< "<span class='userdanger'>WE LIVE AGAIN!</span>"
to_chat(owner.current, "<span class='userdanger'>WE LIVE AGAIN!</span>")
return hellish_resurrection(body)
else
owner.current<< "<span class='userdanger'>Unfortunately, the power that stemmed from your contracts has been extinguished. You no longer have enough power to resurrect.</span>"
to_chat(owner.current, "<span class='userdanger'>Unfortunately, the power that stemmed from your contracts has been extinguished. You no longer have enough power to resurrect.</span>")
return -1
else
owner.current << "<span class='danger'> You seem to have resurrected without your hellish powers.</span>"
to_chat(owner.current, "<span class='danger'> You seem to have resurrected without your hellish powers.</span>")
else
owner.current << "<span class='userdanger'>Your hellish powers are too weak to resurrect yourself.</span>"
to_chat(owner.current, "<span class='userdanger'>Your hellish powers are too weak to resurrect yourself.</span>")
/datum/devilinfo/proc/check_banishment(mob/living/body)
switch(banish)
@@ -403,7 +397,7 @@ var/global/list/lawlorify = list (
/datum/devilinfo/proc/hellish_resurrection(mob/living/body)
message_admins("[owner.name] (true name is: [truename]) is resurrecting using hellish energy.</a>")
if(SOULVALUE <= ARCH_THRESHOLD) // once ascended, arch devils do not go down in power by any means.
if(SOULVALUE < ARCH_THRESHOLD && ascendable) // once ascended, arch devils do not go down in power by any means.
reviveNumber += LOSS_PER_DEATH
update_hud()
if(body)
@@ -414,41 +408,50 @@ var/global/list/lawlorify = list (
var/mob/living/carbon/true_devil/D = body
if(D.oldform)
D.oldform.revive(1,0) // Heal the old body too, so the devil doesn't resurrect, then immediately regress into a dead body.
if(body.stat == DEAD)
create_new_body()
else
if(blobstart.len > 0)
var/turf/targetturf = get_turf(pick(blobstart))
var/mob/currentMob = owner.current
if(!currentMob)
currentMob = owner.get_ghost()
if(!currentMob)
message_admins("[owner.name]'s devil resurrection failed due to client logoff. Aborting.")
return -1 //
if(currentMob.mind != owner)
message_admins("[owner.name]'s devil resurrection failed due to becoming a new mob. Aborting.")
return -1
currentMob.change_mob_type( /mob/living/carbon/human , targetturf, null, 1)
var/mob/living/carbon/human/H = owner.current
give_summon_contract()
if(SOULVALUE >= BLOOD_THRESHOLD)
H.set_species(/datum/species/lizard, 1)
H.underwear = "Nude"
H.undershirt = "Nude"
H.socks = "Nude"
H.dna.features["mcolor"] = "511"
H.regenerate_icons()
if(SOULVALUE >= TRUE_THRESHOLD) //Yes, BOTH this and the above if statement are to run if soulpower is high enough.
var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(targetturf)
A.faction |= "hell"
H.forceMove(A)
A.oldform = H
A.set_name()
owner.transfer_to(A)
if(SOULVALUE >= ARCH_THRESHOLD)
A.convert_to_archdevil()
else
throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection")
create_new_body()
check_regression()
/datum/devilinfo/proc/create_new_body()
if(blobstart.len > 0)
var/turf/targetturf = get_turf(pick(blobstart))
var/mob/currentMob = owner.current
if(!currentMob)
currentMob = owner.get_ghost()
if(!currentMob)
message_admins("[owner.name]'s devil resurrection failed due to client logoff. Aborting.")
return -1
if(currentMob.mind != owner)
message_admins("[owner.name]'s devil resurrection failed due to becoming a new mob. Aborting.")
return -1
currentMob.change_mob_type( /mob/living/carbon/human, targetturf, null, 1)
var/mob/living/carbon/human/H = owner.current
H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/black(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_hands)
H.equip_to_slot_or_del(new /obj/item/weapon/pen(H), slot_l_store)
if(SOULVALUE >= BLOOD_THRESHOLD)
H.set_species(/datum/species/lizard, 1)
H.underwear = "Nude"
H.undershirt = "Nude"
H.socks = "Nude"
H.dna.features["mcolor"] = "511"
H.regenerate_icons()
if(SOULVALUE >= TRUE_THRESHOLD) //Yes, BOTH this and the above if statement are to run if soulpower is high enough.
var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(targetturf)
A.faction |= "hell"
H.forceMove(A)
A.oldform = H
A.set_name()
owner.transfer_to(A)
if(SOULVALUE >= ARCH_THRESHOLD && ascendable)
A.convert_to_archdevil()
else
throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection")
/datum/devilinfo/proc/update_hud()
if(istype(owner.current, /mob/living/carbon))
var/mob/living/C = owner.current
+14 -13
View File
@@ -14,7 +14,7 @@
text += printobjectives(sintouched_mind)
text += "<br>"
text += "<br>"
world << text
to_chat(world, text)
/datum/game_mode/proc/auto_declare_completion_devils()
/var/text = ""
@@ -27,14 +27,15 @@
text += printobjectives(devil)
text += "<br>"
text += "<br>"
world << text
to_chat(world, text)
/datum/game_mode/proc/finalize_devil(datum/mind/devil_mind)
/datum/game_mode/proc/finalize_devil(datum/mind/devil_mind, ascendable = FALSE)
var/trueName= randomDevilName()
devil_mind.devilinfo = devilInfo(trueName, 1)
devil_mind.devilinfo.ascendable = ascendable
devil_mind.store_memory("Your devilic true name is [devil_mind.devilinfo.truename]<br>[lawlorify[LAW][devil_mind.devilinfo.ban]]<br>You may not use violence to coerce someone into selling their soul.<br>You may not directly and knowingly physically harm a devil, other than yourself.<br>[lawlorify[LAW][devil_mind.devilinfo.bane]]<br>[lawlorify[LAW][devil_mind.devilinfo.obligation]]<br>[lawlorify[LAW][devil_mind.devilinfo.banish]]<br>")
devil_mind.devilinfo.owner = devil_mind
devil_mind.devilinfo.give_base_spells(1)
@@ -42,7 +43,7 @@
devil_mind.devilinfo.update_hud()
if(devil_mind.assigned_role == "Clown" && ishuman(devil_mind.current))
var/mob/living/carbon/human/S = devil_mind.current
S << "<span class='notice'>Your infernal nature has allowed you to overcome your clownishness.</span>"
to_chat(S, "<span class='notice'>Your infernal nature has allowed you to overcome your clownishness.</span>")
S.dna.remove_mutation(CLOWNMUT)
if(issilicon(devil_mind.current))
add_law_sixsixsix(devil_mind.current)
@@ -62,15 +63,15 @@
/datum/mind/proc/announceDevilLaws()
if(!devilinfo)
return
current << "<span class='warning'><b>You remember your link to the infernal. You are [src.devilinfo.truename], an agent of hell, a devil. And you were sent to the plane of creation for a reason. A greater purpose. Convince the crew to sin, and embroiden Hell's grasp.</b></span>"
current << "<span class='warning'><b>However, your infernal form is not without weaknesses.</b></span>"
current << "You may not use violence to coerce someone into selling their soul."
current << "You may not directly and knowingly physically harm a devil, other than yourself."
current << lawlorify[LAW][src.devilinfo.bane]
current << lawlorify[LAW][src.devilinfo.ban]
current << lawlorify[LAW][src.devilinfo.obligation]
current << lawlorify[LAW][src.devilinfo.banish]
current << "<br/><br/><span class='warning'>Remember, the crew can research your weaknesses if they find out your devil name.</span><br>"
to_chat(current, "<span class='warning'><b>You remember your link to the infernal. You are [src.devilinfo.truename], an agent of hell, a devil. And you were sent to the plane of creation for a reason. A greater purpose. Convince the crew to sin, and embroiden Hell's grasp.</b></span>")
to_chat(current, "<span class='warning'><b>However, your infernal form is not without weaknesses.</b></span>")
to_chat(current, "You may not use violence to coerce someone into selling their soul.")
to_chat(current, "You may not directly and knowingly physically harm a devil, other than yourself.")
to_chat(current, lawlorify[LAW][src.devilinfo.bane])
to_chat(current, lawlorify[LAW][src.devilinfo.ban])
to_chat(current, lawlorify[LAW][src.devilinfo.obligation])
to_chat(current, lawlorify[LAW][src.devilinfo.banish])
to_chat(current, "<br/><br/><span class='warning'>Remember, the crew can research your weaknesses if they find out your devil name.</span><br>")
/datum/game_mode/proc/printdevilinfo(datum/mind/ply)
if(!ply.devilinfo)
+1 -1
View File
@@ -38,7 +38,7 @@
Though you are not obligated to help, perhaps by aiding a higher ranking devil, you might just get a promotion. However, you are incapable \
of intentionally harming a fellow devil.</B>"
/mob/living/simple_animal/imp/New()
/mob/living/simple_animal/imp/Initialize()
..()
boost = world.time + 30
@@ -27,7 +27,7 @@
/mob/living/carbon/true_devil/New()
/mob/living/carbon/true_devil/Initialize()
create_bodyparts() //initialize bodyparts
create_internal_organs()
@@ -87,7 +87,7 @@
else if(health < (maxHealth/2))
msg += "<span class='warning'>You can see hellfire inside its wounds.</span>\n"
msg += "*---------*</span>"
user << msg
to_chat(user, msg)
/mob/living/carbon/true_devil/IsAdvancedToolUser()
@@ -151,8 +151,8 @@
var/datum/objective/newobjective = new
newobjective.explanation_text = "Try to get a promotion to a higher devilic rank."
S.mind.objectives += newobjective
S << S.playstyle_string
S << "<B>Objective #[1]</B>: [newobjective.explanation_text]"
to_chat(S, S.playstyle_string)
to_chat(S, "<B>Objective #[1]</B>: [newobjective.explanation_text]")
return
else
return ..()
+15 -15
View File
@@ -46,14 +46,14 @@
/datum/game_mode/proc/announce() //Shows the gamemode's name and a fast description.
world << "<b>The gamemode is: <span class='[announce_span]'>[name]</span>!</b>"
world << "<b>[announce_text]</b>"
to_chat(world, "<b>The gamemode is: <span class='[announce_span]'>[name]</span>!</b>")
to_chat(world, "<b>[announce_text]</b>")
///Checks to see if the game can be setup and ran with the current number of players or whatnot.
/datum/game_mode/proc/can_start()
var/playerC = 0
for(var/mob/new_player/player in player_list)
for(var/mob/dead/new_player/player in player_list)
if((player.client)&&(player.ready))
playerC++
if(!Debug2)
@@ -103,7 +103,7 @@
return
///Allows rounds to basically be "rerolled" should the initial premise fall through
///Allows rounds to basically be "rerolled" should the initial premise fall through. Also known as mulligan antags.
/datum/game_mode/proc/convert_roundtype()
var/list/living_crew = list()
@@ -156,9 +156,9 @@
if(config.protect_assistant_from_antagonist)
replacementmode.restricted_jobs += "Assistant"
message_admins("The roundtype will be converted. If you have other plans for the station or think the round should end <A HREF='?_src_=holder;toggle_midround_antag=\ref[usr]'>stop the creation of antags</A> or <A HREF='?_src_=holder;end_round=\ref[usr]'>end the round now</A>.")
message_admins("The roundtype will be converted. If you have other plans for the station or feel the station is too messed up to inhabit <A HREF='?_src_=holder;toggle_midround_antag=\ref[usr]'>stop the creation of antags</A> or <A HREF='?_src_=holder;end_round=\ref[usr]'>end the round now</A>.")
spawn(rand(1200,3000)) //somewhere between 2 and 5 minutes from now
spawn(rand(600,1800)) //somewhere between 1 and 3 minutes from now
if(!config.midround_antag[ticker.mode.config_tag])
round_converted = 0
return 1
@@ -289,7 +289,7 @@
G.on_report()
intercepttext += G.get_report()
print_command_report(intercepttext, "Central Command Status Summary")
print_command_report(intercepttext, "Central Command Status Summary", announce=FALSE)
priority_announce("A summary has been copied and printed to all communications consoles.", "Enemy communication intercepted. Security level elevated.", 'sound/AI/intercept.ogg')
if(security_level < SEC_LEVEL_BLUE)
set_security_level(SEC_LEVEL_BLUE)
@@ -302,7 +302,7 @@
var/datum/mind/applicant = null
// Ultimate randomizing code right here
for(var/mob/new_player/player in player_list)
for(var/mob/dead/new_player/player in player_list)
if(player.client && player.ready)
players += player
@@ -310,7 +310,7 @@
// Goodbye antag dante
players = shuffle(players)
for(var/mob/new_player/player in players)
for(var/mob/dead/new_player/player in players)
if(player.client && player.ready)
if(role in player.client.prefs.be_special)
if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, role)) //Nodrak/Carn: Antag Job-bans
@@ -324,7 +324,7 @@
candidates -= player
if(candidates.len < recommended_enemies)
for(var/mob/new_player/player in players)
for(var/mob/dead/new_player/player in players)
if(player.client && player.ready)
if(!(role in player.client.prefs.be_special)) // We don't have enough people who want to be antagonist, make a seperate list of people who don't want to be one
if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, role)) //Nodrak/Carn: Antag Job-bans
@@ -349,7 +349,7 @@
break
/*
if(candidates.len < recommended_enemies && override_jobbans) //If we still don't have enough people, we're going to start drafting banned people.
for(var/mob/new_player/player in players)
for(var/mob/dead/new_player/player in players)
if (player.client && player.ready)
if(jobban_isbanned(player, "Syndicate") || jobban_isbanned(player, roletext)) //Nodrak/Carn: Antag Job-bans
drafted += player.mind
@@ -377,7 +377,7 @@
// Less if there are not enough valid players in the game entirely to make recommended_enemies.
/*
/datum/game_mode/proc/check_player_role_pref(var/role, var/mob/new_player/player)
/datum/game_mode/proc/check_player_role_pref(var/role, var/mob/dead/new_player/player)
if(player.preferences.be_special & role)
return 1
return 0
@@ -385,7 +385,7 @@
/datum/game_mode/proc/num_players()
. = 0
for(var/mob/new_player/P in player_list)
for(var/mob/dead/new_player/P in player_list)
if(P.client && P.ready)
. ++
@@ -479,7 +479,7 @@
for(var/mob/M in mob_list)
if(M.client && M.client.holder)
M << msg
to_chat(M, msg)
/datum/game_mode/proc/printplayer(datum/mind/ply, fleecheck)
var/text = "<br><b>[ply.key]</b> was <b>[ply.name]</b> the <b>[ply.assigned_role]</b> and"
@@ -531,7 +531,7 @@
var/mob/dead/observer/theghost = null
if(candidates.len)
theghost = pick(candidates)
M << "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!"
to_chat(M, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!")
message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(M)]) to replace a jobbaned player.")
M.ghostize(0)
M.key = theghost.key
+9 -13
View File
@@ -21,7 +21,7 @@
/obj/machinery/dominator/New()
..()
SetLuminosity(2)
set_light(2)
poi_list |= src
spark_system = new
spark_system.set_up(5, 1, src)
@@ -36,12 +36,12 @@
if(gang && gang.is_dominating)
time = gang.domination_time_remaining()
if(time > 0)
user << "<span class='notice'>Hostile Takeover in progress. Estimated [time] seconds remain.</span>"
to_chat(user, "<span class='notice'>Hostile Takeover in progress. Estimated [time] seconds remain.</span>")
else
user << "<span class='notice'>Hostile Takeover of [station_name()] successful. Have a great day.</span>"
to_chat(user, "<span class='notice'>Hostile Takeover of [station_name()] successful. Have a great day.</span>")
else
user << "<span class='notice'>System on standby.</span>"
user << "<span class='danger'>System Integrity: [round((obj_integrity/max_integrity)*100,1)]%</span>"
to_chat(user, "<span class='notice'>System on standby.</span>")
to_chat(user, "<span class='danger'>System Integrity: [round((obj_integrity/max_integrity)*100,1)]%</span>")
/obj/machinery/dominator/process()
..()
@@ -117,7 +117,7 @@
gang.message_gangtools("Hostile takeover cancelled: Dominator is no longer operational.[gang.dom_attempts ? " You have [gang.dom_attempts] attempt remaining." : " The station network will have likely blocked any more attempts by us."]",1,1)
SetLuminosity(0)
set_light(0)
icon_state = "dominator-broken"
cut_overlays()
operating = 0
@@ -153,11 +153,11 @@
return
if(tempgang.is_dominating)
user << "<span class='warning'>Error: Hostile Takeover is already in progress.</span>"
to_chat(user, "<span class='warning'>Error: Hostile Takeover is already in progress.</span>")
return
if(!tempgang.dom_attempts)
user << "<span class='warning'>Error: Unable to breach station network. Firewall has logged our signature and is blocking all further attempts.</span>"
to_chat(user, "<span class='warning'>Error: Unable to breach station network. Firewall has logged our signature and is blocking all further attempts.</span>")
return
var/time = round(determine_domination_time(tempgang)/60,0.1)
@@ -180,14 +180,10 @@
countdown.color = gang.color_hex
countdown.start()
SetLuminosity(3)
set_light(3)
START_PROCESSING(SSmachine, src)
gang.message_gangtools("Hostile takeover in progress: Estimated [time] minutes until victory.[gang.dom_attempts ? "" : " This is your final attempt."]")
for(var/datum/gang/G in ticker.mode.gangs)
if(G != gang)
G.message_gangtools("Enemy takeover attempt detected in [locname]: Estimated [time] minutes until our defeat.",1,1)
+22 -22
View File
@@ -92,7 +92,7 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
/datum/game_mode/proc/greet_gang(datum/mind/boss_mind, you_are=1)
if (you_are)
boss_mind.current << "<FONT size=3 color=red><B>You are the Boss of the [boss_mind.gang_datum.name] Gang!</B></FONT>"
to_chat(boss_mind.current, "<FONT size=3 color=red><B>You are the Boss of the [boss_mind.gang_datum.name] Gang!</B></FONT>")
boss_mind.announce_objectives()
///////////////////////////////////////////////////////////////////////////
@@ -104,7 +104,7 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
if (mob.mind)
if (mob.mind.assigned_role == "Clown")
mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself."
to_chat(mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.")
mob.dna.remove_mutation(CLOWNMUT)
var/obj/item/device/gangtool/gangtool = new(mob)
@@ -122,33 +122,33 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
var/where = mob.equip_in_one_of_slots(gangtool, slots)
if (!where)
mob << "Your Syndicate benefactors were unfortunately unable to get you a Gangtool."
to_chat(mob, "Your Syndicate benefactors were unfortunately unable to get you a Gangtool.")
. += 1
else
gangtool.register_device(mob)
mob << "The <b>Gangtool</b> in your [where] will allow you to purchase weapons and equipment, send messages to your gang, and recall the emergency shuttle from anywhere on the station."
mob << "As the gang boss, you can also promote your gang members to <b>lieutenant</b>. Unlike regular gangsters, Lieutenants cannot be deconverted and are able to use recruitment pens and gangtools."
to_chat(mob, "The <b>Gangtool</b> in your [where] will allow you to purchase weapons and equipment, send messages to your gang, and recall the emergency shuttle from anywhere on the station.")
to_chat(mob, "As the gang boss, you can also promote your gang members to <b>lieutenant</b>. Unlike regular gangsters, Lieutenants cannot be deconverted and are able to use recruitment pens and gangtools.")
var/where2 = mob.equip_in_one_of_slots(T, slots)
if (!where2)
mob << "Your Syndicate benefactors were unfortunately unable to get you a recruitment pen to start."
to_chat(mob, "Your Syndicate benefactors were unfortunately unable to get you a recruitment pen to start.")
. += 1
else
mob << "The <b>recruitment pen</b> in your [where2] will help you get your gang started. Stab unsuspecting crew members with it to recruit them."
to_chat(mob, "The <b>recruitment pen</b> in your [where2] will help you get your gang started. Stab unsuspecting crew members with it to recruit them.")
var/where3 = mob.equip_in_one_of_slots(SC, slots)
if (!where3)
mob << "Your Syndicate benefactors were unfortunately unable to get you a territory spraycan to start."
to_chat(mob, "Your Syndicate benefactors were unfortunately unable to get you a territory spraycan to start.")
. += 1
else
mob << "The <b>territory spraycan</b> in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get. All gangsters can use these, so distribute them to grow your influence faster."
to_chat(mob, "The <b>territory spraycan</b> in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get. All gangsters can use these, so distribute them to grow your influence faster.")
var/where4 = mob.equip_in_one_of_slots(C, slots)
if (!where4)
mob << "Your Syndicate benefactors were unfortunately unable to get you a chameleon security HUD."
to_chat(mob, "Your Syndicate benefactors were unfortunately unable to get you a chameleon security HUD.")
. += 1
else
mob << "The <b>chameleon security HUD</b> in your [where4] will help you keep track of who is mindshield-implanted, and unable to be recruited."
to_chat(mob, "The <b>chameleon security HUD</b> in your [where4] will help you keep track of who is mindshield-implanted, and unable to be recruited.")
return .
@@ -169,12 +169,12 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
carbon_mob.flash_act(1, 1)
gangster_mind.current.Stun(5)
if(G.is_deconvertible)
gangster_mind.current << "<FONT size=3 color=red><B>You are now a member of the [G.name] Gang!</B></FONT>"
gangster_mind.current << "<font color='red'>Help your bosses take over the station by claiming territory with <b>special spraycans</b> only they can provide. Simply spray on any unclaimed area of the station.</font>"
gangster_mind.current << "<font color='red'>Their ultimate objective is to take over the station with a Dominator machine.</font>"
gangster_mind.current << "<font color='red'>You can identify your bosses by their <b>large, bright [G.color] \[G\] icon</b>.</font>"
to_chat(gangster_mind.current, "<FONT size=3 color=red><B>You are now a member of the [G.name] Gang!</B></FONT>")
to_chat(gangster_mind.current, "<font color='red'>Help your bosses take over the station by claiming territory with <b>special spraycans</b> only they can provide. Simply spray on any unclaimed area of the station.</font>")
to_chat(gangster_mind.current, "<font color='red'>Their ultimate objective is to take over the station with a Dominator machine.</font>")
to_chat(gangster_mind.current, "<font color='red'>You can identify your bosses by their <b>large, bright [G.color] \[G\] icon</b>.</font>")
gangster_mind.store_memory("You are a member of the [G.name] Gang!")
gangster_mind.current.attack_log += "\[[time_stamp()]\] <font color='red'>Has been converted to the [G.name] Gang!</font>"
gangster_mind.current.log_message("<font color='red'>Has been converted to the [G.name] Gang!</font>", INDIVIDUAL_ATTACK_LOG)
gangster_mind.special_role = "[G.name] Gangster"
G.add_gang_hud(gangster_mind)
@@ -208,18 +208,18 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
gangster_mind.gang_datum = null
if(silent < 2)
gangster_mind.current.attack_log += "\[[time_stamp()]\] <font color='red'>Has reformed and defected from the [gang.name] Gang!</font>"
gangster_mind.current.log_message("<font color='red'>Has reformed and defected from the [gang.name] Gang!</font>", INDIVIDUAL_ATTACK_LOG)
if(beingborged)
if(!silent)
gangster_mind.current.visible_message("The frame beeps contentedly from the MMI before initalizing it.")
gangster_mind.current << "<FONT size=3 color=red><B>The frame's firmware detects and deletes your criminal behavior! You are no longer a gangster!</B></FONT>"
to_chat(gangster_mind.current, "<FONT size=3 color=red><B>The frame's firmware detects and deletes your criminal behavior! You are no longer a gangster!</B></FONT>")
message_admins("[ADMIN_LOOKUPFLW(gangster_mind.current)] has been borged while being a member of the [gang.name] Gang. They are no longer a gangster.")
else
if(!silent)
gangster_mind.current.Paralyse(5)
gangster_mind.current.visible_message("<FONT size=3><B>[gangster_mind.current] looks like they've given up the life of crime!<B></font>")
gangster_mind.current << "<FONT size=3 color=red><B>You have been reformed! You are no longer a gangster!</B><BR>You try as hard as you can, but you can't seem to recall any of the identities of your former gangsters...</FONT>"
to_chat(gangster_mind.current, "<FONT size=3 color=red><B>You have been reformed! You are no longer a gangster!</B><BR>You try as hard as you can, but you can't seem to recall any of the identities of your former gangsters...</FONT>")
gangster_mind.memory = ""
gang.remove_gang_hud(gangster_mind)
@@ -258,12 +258,12 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
if(!gangs.len)
return
if(!winner)
world << "<span class='redtext'>The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]</span><br>"
to_chat(world, "<span class='redtext'>The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]</span><br>")
feedback_set_details("round_end_result","loss - gangs failed takeover")
ticker.news_report = GANG_LOSS
else
world << "<span class='redtext'>The [winner.name] Gang successfully performed a hostile takeover of the station!</span><br>"
to_chat(world, "<span class='redtext'>The [winner.name] Gang successfully performed a hostile takeover of the station!</span><br>")
feedback_set_details("round_end_result","win - gang domination complete")
ticker.news_report = GANG_TAKEOVER
@@ -277,7 +277,7 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
for(var/datum/mind/gangster in G.gangsters)
text += printplayer(gangster, 1)
text += "<br>"
world << text
to_chat(world, text)
//////////////////////////////////////////////////////////
//Handles influence, territories, and the victory checks//
+2 -2
View File
@@ -159,7 +159,7 @@
var/mob/living/mob = get(tool.loc,/mob/living)
if(mob && mob.mind && mob.stat == CONSCIOUS)
if(mob.mind.gang_datum == src)
mob << "<span class='[warning ? "warning" : "notice"]'>\icon[tool] [message]</span>"
to_chat(mob, "<span class='[warning ? "warning" : "notice"]'>\icon[tool] [message]</span>")
return
@@ -206,7 +206,7 @@
gang_outfit = outfit
if(gang_outfit)
gangster << "<span class='notice'>The [src] Gang's influence grows as you wear [gang_outfit].</span>"
to_chat(gangster, "<span class='notice'>The [src] Gang's influence grows as you wear [gang_outfit].</span>")
uniformed ++
//Calculate and report influence growth
+7 -7
View File
@@ -22,7 +22,7 @@
var/obj/item/O = new item_path(user.loc)
user.put_in_hands(O)
if(spawn_msg)
user << spawn_msg
to_chat(user, spawn_msg)
/datum/gang_item/proc/can_buy(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
return gang && (gang.points >= get_cost(user, gang, gangtool)) && can_see(user, gang, gangtool)
@@ -92,7 +92,7 @@
/datum/gang_item/function/outfit/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
if(gang && gang.gang_outfit(user, gangtool))
user << "<span class='notice'><b>Gang Outfits</b> can act as armor with moderate protection against ballistic and melee attacks. Every gangster wearing one will also help grow your gang's influence.</span>"
to_chat(user, "<span class='notice'><b>Gang Outfits</b> can act as armor with moderate protection against ballistic and melee attacks. Every gangster wearing one will also help grow your gang's influence.</span>")
if(gangtool)
gangtool.outfits -= 1
@@ -200,7 +200,7 @@
var/obj/item/O = new item_path(user.loc, gang) //we need to override this whole proc for this one argument
user.put_in_hands(O)
if(spawn_msg)
user << spawn_msg
to_chat(user, spawn_msg)
/datum/gang_item/equipment/pen
name = "Recruitment Pen"
@@ -235,7 +235,7 @@
if(gang && isboss(user, gang))
item_type = /obj/item/device/gangtool/spare/lt
if(gang.bosses.len < 3)
user << "<span class='notice'><b>Gangtools</b> allow you to promote a gangster to be your Lieutenant, enabling them to recruit and purchase items like you. Simply have them register the gangtool. You may promote up to [3-gang.bosses.len] more Lieutenants</span>"
to_chat(user, "<span class='notice'><b>Gangtools</b> allow you to promote a gangster to be your Lieutenant, enabling them to recruit and purchase items like you. Simply have them register the gangtool. You may promote up to [3-gang.bosses.len] more Lieutenants</span>")
else
item_type = /obj/item/device/gangtool/spare
var/obj/item/device/gangtool/spare/tool = new item_type(user.loc)
@@ -277,16 +277,16 @@
var/area/usrarea = get_area(user.loc)
var/usrturf = get_turf(user.loc)
if(initial(usrarea.name) == "Space" || isspaceturf(usrturf) || usr.z != 1)
user << "<span class='warning'>You can only use this on the station!</span>"
to_chat(user, "<span class='warning'>You can only use this on the station!</span>")
return FALSE
for(var/obj/obj in usrturf)
if(obj.density)
user << "<span class='warning'>There's not enough room here!</span>"
to_chat(user, "<span class='warning'>There's not enough room here!</span>")
return FALSE
if(!(usrarea.type in gang.territory|gang.territory_new))
user << "<span class='warning'>The <b>dominator</b> can be spawned only on territory controlled by your gang!</span>"
to_chat(user, "<span class='warning'>The <b>dominator</b> can be spawned only on territory controlled by your gang!</span>")
return FALSE
return ..()

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