mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 10:21:11 +00:00
the NARSIE HAS RISEN update
This commit is contained in:
@@ -1267,6 +1267,7 @@
|
||||
#include "code\modules\power\singularity\field_generator.dm"
|
||||
#include "code\modules\power\singularity\generator.dm"
|
||||
#include "code\modules\power\singularity\investigate.dm"
|
||||
#include "code\modules\power\singularity\narsie.dm"
|
||||
#include "code\modules\power\singularity\singularity.dm"
|
||||
#include "code\modules\power\singularity\particle_accelerator\particle.dm"
|
||||
#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm"
|
||||
|
||||
@@ -57,6 +57,57 @@
|
||||
|
||||
summon_type = list(/obj/item/device/soulstone)
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/pylon
|
||||
name = "Red Pylon"
|
||||
desc = "This spell conjures a fragile crystal from Nar-Sie's realm. Makes for a convenient light source."
|
||||
|
||||
school = "conjuration"
|
||||
charge_max = 200
|
||||
clothes_req = 0
|
||||
invocation = "none"
|
||||
invocation_type = "none"
|
||||
range = 0
|
||||
|
||||
summon_type = list(/obj/structure/cult/pylon)
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/pylon/cast(list/targets)
|
||||
for(var/turf/T in targets)
|
||||
if(T.density && !summon_ignore_density)
|
||||
targets -= T
|
||||
|
||||
playsound(get_turf(src), cast_sound, 50, 1)
|
||||
|
||||
if(do_after(usr,delay))
|
||||
for(var/i=0,i<summon_amt,i++)
|
||||
if(!targets.len)
|
||||
break
|
||||
var/summoned_object_type = pick(summon_type)
|
||||
var/turf/spawn_place = pick(targets)
|
||||
if(summon_ignore_prev_spawn_points)
|
||||
targets -= spawn_place
|
||||
|
||||
for(var/obj/structure/cult/pylon/P in spawn_place.contents)
|
||||
if(P.isbroken)
|
||||
P.repair(usr)
|
||||
return
|
||||
else
|
||||
return
|
||||
var/atom/summoned_object = new summoned_object_type(spawn_place)
|
||||
|
||||
for(var/varName in newVars)
|
||||
if(varName in summoned_object.vars)
|
||||
summoned_object.vars[varName] = newVars[varName]
|
||||
|
||||
else
|
||||
switch(charge_type)
|
||||
if("recharge")
|
||||
charge_counter = charge_max - 5//So you don't lose charge for a failed spell(Also prevents most over-fill)
|
||||
if("charges")
|
||||
charge_counter++//Ditto, just for different spell types
|
||||
|
||||
|
||||
return
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall
|
||||
name = "Shield"
|
||||
|
||||
@@ -18,8 +18,55 @@
|
||||
name = "Pylon"
|
||||
desc = "A floating crystal that hums with an unearthly energy"
|
||||
icon_state = "pylon"
|
||||
var/isbroken = 0
|
||||
luminosity = 5
|
||||
l_color = "#B40000"
|
||||
var/obj/item/wepon = null
|
||||
|
||||
/obj/structure/cult/pylon/attack_hand(mob/M as mob)
|
||||
wepon = new /obj/item
|
||||
wepon.force = 5
|
||||
attackby(wepon, M)
|
||||
wepon = null
|
||||
|
||||
/obj/structure/cult/pylon/attack_animal(mob/living/simple_animal/user as mob)
|
||||
if(user.environment_smash)
|
||||
wepon = new /obj/item
|
||||
wepon.force = user.melee_damage_upper
|
||||
attackby(wepon, user)
|
||||
wepon = null
|
||||
|
||||
/obj/structure/cult/pylon/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(!isbroken)
|
||||
if(prob(1+W.force * 5))
|
||||
user << "You hit the pylon, and its crystal breaks apart!"
|
||||
for(var/mob/M in viewers(src))
|
||||
if(M == user)
|
||||
continue
|
||||
M.show_message("[user.name] smashed the pylon!", 3, "You hear a tinkle of crystal shards", 2)
|
||||
playsound(get_turf(src), 'sound/effects/Glassbr3.ogg', 75, 1)
|
||||
isbroken = 1
|
||||
density = 0
|
||||
icon_state = "pylon-broken"
|
||||
SetLuminosity(0)
|
||||
else
|
||||
user << "You hit the pylon!"
|
||||
playsound(get_turf(src), 'sound/effects/Glasshit.ogg', 75, 1)
|
||||
else
|
||||
if(prob(W.force * 2))
|
||||
user << "You pulverize what was left of the pylon!"
|
||||
qdel(src)
|
||||
else
|
||||
user << "You hit the pylon!"
|
||||
playsound(get_turf(src), 'sound/effects/Glasshit.ogg', 75, 1)
|
||||
|
||||
/obj/structure/cult/pylon/proc/repair(mob/user as mob)
|
||||
if(isbroken)
|
||||
user << "You repair the pylon."
|
||||
isbroken = 0
|
||||
density = 1
|
||||
icon_state = "pylon"
|
||||
SetLuminosity(5)
|
||||
|
||||
/obj/structure/cult/tome
|
||||
name = "Desk"
|
||||
|
||||
@@ -27,8 +27,11 @@ In short:
|
||||
if(istype(T,/turf/simulated/wall) && !istype(T,/turf/simulated/wall/cult))
|
||||
T.ChangeTurf(/turf/simulated/wall/cult)
|
||||
return
|
||||
if(istype(T,/turf/simulated/floor) && !istype(T,/turf/simulated/floor/engine/cult))
|
||||
if(istype(T,/turf/simulated/floor) && !istype(T,/turf/simulated/floor/engine/cult) && !istype(T,/turf/simulated/floor/carpet))
|
||||
T.ChangeTurf(/turf/simulated/floor/engine/cult)
|
||||
for(var/obj/machinery/light/L in T.contents)
|
||||
new /obj/structure/cult/pylon(L.loc)
|
||||
qdel(L)
|
||||
return
|
||||
|
||||
|
||||
@@ -57,6 +60,7 @@ In short:
|
||||
A.party = null
|
||||
A.radalert = 0
|
||||
|
||||
/*
|
||||
// Slap random alerts on shit
|
||||
if(prob(25))
|
||||
switch(rand(1,4))
|
||||
@@ -68,6 +72,7 @@ In short:
|
||||
A.radalert=1
|
||||
if(4)
|
||||
A.party=1
|
||||
*/
|
||||
|
||||
A.updateicon()
|
||||
|
||||
@@ -91,4 +96,6 @@ In short:
|
||||
if(M && !M.client)
|
||||
M.stat = DEAD
|
||||
|
||||
runedec += 9000 //basically removing the rune cap
|
||||
|
||||
ticker.StartThematic("endgame")
|
||||
@@ -1,7 +1,7 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
var/cultwords = list()
|
||||
var/runedec = 0
|
||||
var/global/runedec = 0
|
||||
var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", "self", "see", "other", "hide")
|
||||
|
||||
/client/proc/check_words() // -- Urist
|
||||
|
||||
@@ -716,6 +716,7 @@ var/global/floorIsLava = 0
|
||||
<A href='?src=\ref[src];secretsfun=blackout'>Break all lights</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=whiteout'>Fix all lights</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=floorlava'>The floor is lava! (DANGEROUS: extremely lame)</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=togglenarsie'>Toggle Nar-Sie's behaviour</A><BR>
|
||||
<BR>
|
||||
<B>Final Soloutions</B><BR>
|
||||
<I>(Warning, these will end the round!)</I><BR>
|
||||
|
||||
@@ -2441,6 +2441,16 @@
|
||||
feedback_add_details("admin_secrets_fun_used","OO")
|
||||
usr.client.only_one()
|
||||
// message_admins("[key_name_admin(usr)] has triggered a battle to the death (only one)")
|
||||
if("togglenarsie")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","NA")
|
||||
var/choice = input("How do you wish for narsie to interract with her surroundings?.") in list("CultStation13", "Nar-Singulo")
|
||||
if(choice == "CultStation13")
|
||||
message_admins("[key_name_admin(usr)] has set narsie's behaviour to \"CultStation13\".")
|
||||
narsie_behaviour = "CultStation13"
|
||||
if(choice == "Nar-Singulo")
|
||||
message_admins("[key_name_admin(usr)] has set narsie's behaviour to \"Nar-Singulo\".")
|
||||
narsie_behaviour = "Nar-Singulo"
|
||||
if("hellonearth")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","NS")
|
||||
|
||||
@@ -225,6 +225,7 @@
|
||||
melee_damage_upper = 25
|
||||
attacktext = "slashes"
|
||||
speed = -1
|
||||
environment_smash = 1
|
||||
see_in_dark = 7
|
||||
attack_sound = 'sound/weapons/rapidslice.ogg'
|
||||
construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift)
|
||||
@@ -256,6 +257,7 @@
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/wall,
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/floor,
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone,
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/pylon,
|
||||
///obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser
|
||||
)
|
||||
|
||||
|
||||
@@ -43,9 +43,6 @@
|
||||
if(istype(L))
|
||||
owner = L
|
||||
|
||||
/mob/living/simple_animal/hostile/scarybat/cult
|
||||
faction = "cult"
|
||||
|
||||
/mob/living/simple_animal/hostile/scarybat/Process_Spacemove(var/check_drift = 0)
|
||||
return ..() //No drifting in space for space carp! //original comments do not steal
|
||||
|
||||
@@ -65,4 +62,46 @@
|
||||
if(istype(L))
|
||||
if(prob(15))
|
||||
L.Stun(1)
|
||||
L.visible_message("<span class='danger'>\the [src] scares \the [L]!</span>")
|
||||
L.visible_message("<span class='danger'>\the [src] scares \the [L]!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/scarybat/cult
|
||||
faction = "cult"
|
||||
var/shuttletarget = null
|
||||
var/enroute = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/scarybat/cult/Life()
|
||||
..()
|
||||
if(emergency_shuttle.location == 1)
|
||||
if(!enroute && !target) //The shuttle docked, all monsters rush for the escape hallway
|
||||
if(!shuttletarget || (get_dist(src, shuttletarget) >= 2))
|
||||
shuttletarget = pick(get_area_turfs(locate(/area/hallway/secondary/exit)))
|
||||
enroute = 1
|
||||
stop_automated_movement = 1
|
||||
spawn(1)
|
||||
horde()
|
||||
|
||||
if(get_dist(src, shuttletarget) <= 2) //The monster reached the escape hallway
|
||||
enroute = 0
|
||||
stop_automated_movement = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/scarybat/cult/proc/horde()
|
||||
var/turf/T = get_step_to(src, shuttletarget)
|
||||
for(var/atom/A in T)
|
||||
if(istype(A,/obj/machinery/door/airlock))
|
||||
var/obj/machinery/door/airlock/D = A
|
||||
if(D.density && !D.locked && !D.welded)
|
||||
D.open()
|
||||
else if(istype(A,/obj/structure/mineral_door))
|
||||
var/obj/machinery/door/D = A
|
||||
if(D.density)
|
||||
D.open()
|
||||
else if(istype(A,/obj/structure/cult/pylon))
|
||||
A.attack_animal(src)
|
||||
else if(istype(A, /obj/structure/window) || istype(A, /obj/structure/closet) || istype(A, /obj/structure/table) || istype(A, /obj/structure/grille) || istype(A, /obj/structure/rack))
|
||||
A.attack_animal(src)
|
||||
Move(T)
|
||||
var/new_target = FindTarget()
|
||||
GiveTarget(new_target)
|
||||
if(!target || enroute)
|
||||
spawn(10)
|
||||
horde()
|
||||
@@ -16,3 +16,42 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/creature/cult
|
||||
faction = "cult"
|
||||
var/shuttletarget = null
|
||||
var/enroute = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/creature/cult/Life()
|
||||
..()
|
||||
if(emergency_shuttle.location == 1)
|
||||
if(!enroute && !target) //The shuttle docked, all monsters rush for the escape hallway
|
||||
if(!shuttletarget || (get_dist(src, shuttletarget) >= 2))
|
||||
shuttletarget = pick(get_area_turfs(locate(/area/hallway/secondary/exit)))
|
||||
enroute = 1
|
||||
stop_automated_movement = 1
|
||||
spawn(1)
|
||||
horde()
|
||||
|
||||
if(get_dist(src, shuttletarget) <= 2) //The monster reached the escape hallway
|
||||
enroute = 0
|
||||
stop_automated_movement = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/creature/cult/proc/horde()
|
||||
var/turf/T = get_step_to(src, shuttletarget)
|
||||
for(var/atom/A in T)
|
||||
if(istype(A,/obj/machinery/door/airlock))
|
||||
var/obj/machinery/door/airlock/D = A
|
||||
if(D.density && !D.locked && !D.welded)
|
||||
D.open()
|
||||
else if(istype(A,/obj/structure/mineral_door))
|
||||
var/obj/machinery/door/D = A
|
||||
if(D.density)
|
||||
D.open()
|
||||
else if(istype(A,/obj/structure/cult/pylon))
|
||||
A.attack_animal(src)
|
||||
else if(istype(A, /obj/structure/window) || istype(A, /obj/structure/closet) || istype(A, /obj/structure/table) || istype(A, /obj/structure/grille) || istype(A, /obj/structure/rack))
|
||||
A.attack_animal(src)
|
||||
Move(T)
|
||||
var/new_target = FindTarget()
|
||||
GiveTarget(new_target)
|
||||
if(!target || enroute)
|
||||
spawn(10)
|
||||
horde()
|
||||
@@ -32,9 +32,6 @@
|
||||
|
||||
faction = "faithless"
|
||||
|
||||
/mob/living/simple_animal/hostile/faithless/cult
|
||||
faction = "cult"
|
||||
|
||||
/mob/living/simple_animal/hostile/faithless/Process_Spacemove(var/check_drift = 0)
|
||||
return 1
|
||||
|
||||
@@ -49,4 +46,46 @@
|
||||
if(istype(L))
|
||||
if(prob(12))
|
||||
L.Weaken(3)
|
||||
L.visible_message("<span class='danger'>\the [src] knocks down \the [L]!</span>")
|
||||
L.visible_message("<span class='danger'>\the [src] knocks down \the [L]!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/faithless/cult
|
||||
faction = "cult"
|
||||
var/shuttletarget = null
|
||||
var/enroute = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/faithless/cult/Life()
|
||||
..()
|
||||
if(emergency_shuttle.location == 1)
|
||||
if(!enroute && !target) //The shuttle docked, all monsters rush for the escape hallway
|
||||
if(!shuttletarget || (get_dist(src, shuttletarget) >= 2))
|
||||
shuttletarget = pick(get_area_turfs(locate(/area/hallway/secondary/exit)))
|
||||
enroute = 1
|
||||
stop_automated_movement = 1
|
||||
spawn(1)
|
||||
horde()
|
||||
|
||||
if(get_dist(src, shuttletarget) <= 2) //The monster reached the escape hallway
|
||||
enroute = 0
|
||||
stop_automated_movement = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/faithless/cult/proc/horde()
|
||||
var/turf/T = get_step_to(src, shuttletarget)
|
||||
for(var/atom/A in T)
|
||||
if(istype(A,/obj/machinery/door/airlock))
|
||||
var/obj/machinery/door/airlock/D = A
|
||||
if(D.density && !D.locked && !D.welded)
|
||||
D.open()
|
||||
else if(istype(A,/obj/structure/mineral_door))
|
||||
var/obj/machinery/door/D = A
|
||||
if(D.density)
|
||||
D.open()
|
||||
else if(istype(A,/obj/structure/cult/pylon))
|
||||
A.attack_animal(src)
|
||||
else if(istype(A, /obj/structure/window) || istype(A, /obj/structure/closet) || istype(A, /obj/structure/table) || istype(A, /obj/structure/grille) || istype(A, /obj/structure/rack))
|
||||
A.attack_animal(src)
|
||||
Move(T)
|
||||
var/new_target = FindTarget()
|
||||
GiveTarget(new_target)
|
||||
if(!target || enroute)
|
||||
spawn(10)
|
||||
horde()
|
||||
415
code/modules/power/singularity/narsie.dm
Normal file
415
code/modules/power/singularity/narsie.dm
Normal file
@@ -0,0 +1,415 @@
|
||||
var/global/narsie_behaviour = "CultStation13"
|
||||
|
||||
/obj/machinery/singularity/narsie //Moving narsie to its own file for the sake of being clearer
|
||||
name = "Nar-Sie"
|
||||
desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees."
|
||||
icon = 'icons/obj/narsie.dmi'
|
||||
icon_state = "narsie"
|
||||
pixel_x = -89
|
||||
pixel_y = -85
|
||||
|
||||
current_size = 9 //It moves/eats like a max-size singulo, aside from range. --NEO.
|
||||
contained = 0 // Are we going to move around?
|
||||
dissipate = 0 // Do we lose energy over time?
|
||||
grav_pull = 10 //How many tiles out do we pull?
|
||||
consume_range = 3 //How many tiles out do we eat
|
||||
|
||||
var/list/uneatable_narsie = list(
|
||||
/obj/effect/overlay,
|
||||
/mob/dead,
|
||||
/mob/camera,
|
||||
/mob/new_player,
|
||||
/mob/living/simple_animal/construct,
|
||||
/mob/living/simple_animal/hostile/scarybat/cult,
|
||||
/mob/living/simple_animal/hostile/creature/cult,
|
||||
/mob/living/simple_animal/hostile/faithless/cult,
|
||||
/obj/item/weapon/tome,
|
||||
/obj/item/weapon/melee/cultblade,
|
||||
/obj/item/weapon/table_parts/wood,
|
||||
/obj/item/device/soulstone,
|
||||
/obj/structure/constructshell,
|
||||
/obj/structure/cult,
|
||||
/obj/structure/bookcase,
|
||||
/obj/structure/stool/bed/chair/wood/wings,
|
||||
/obj/structure/mineral_door/wood,
|
||||
/obj/structure/table/woodentable,
|
||||
/obj/structure/bookcase,
|
||||
/turf/simulated/floor/carpet,
|
||||
/turf/simulated/floor/engine/cult,
|
||||
/turf/simulated/wall/cult
|
||||
)
|
||||
|
||||
var/list/construct_types = list(
|
||||
/mob/living/simple_animal/construct/armoured,
|
||||
/mob/living/simple_animal/construct/wraith,
|
||||
/mob/living/simple_animal/construct/builder
|
||||
)
|
||||
|
||||
var/list/random_structure = list(
|
||||
/obj/structure/cult/talisman,
|
||||
/obj/structure/cult/forge,
|
||||
/obj/structure/cult/tome
|
||||
//obj/structure/cult/pylon Not included on purpose. These are what lights are replaced by.
|
||||
)
|
||||
|
||||
var/list/trash_machinery = list( //Machinery that gets deleted and isn't replaced with cult structures
|
||||
/obj/machinery/camera,
|
||||
/obj/machinery/power,
|
||||
/obj/machinery/light_switch,
|
||||
/obj/machinery/firealarm,
|
||||
/obj/machinery/alarm,
|
||||
/obj/machinery/atm,
|
||||
/obj/machinery/hologram,
|
||||
/obj/machinery/atmospherics,
|
||||
/obj/machinery/status_display,
|
||||
/obj/machinery/newscaster,
|
||||
/obj/machinery/media,
|
||||
/obj/machinery/door_control,
|
||||
/obj/machinery/access_button,
|
||||
/obj/machinery/embedded_controller,
|
||||
/obj/machinery/navbeacon,
|
||||
/obj/machinery/gateway,
|
||||
/obj/machinery/space_heater,
|
||||
/obj/machinery/crema_switch,
|
||||
/obj/machinery/portable_atmospherics,
|
||||
/obj/machinery/pos,
|
||||
/obj/machinery/requests_console,
|
||||
/obj/machinery/computer/security/telescreen,
|
||||
/obj/machinery/conveyor_switch,
|
||||
/obj/machinery/conveyor,
|
||||
/obj/machinery/vending/wallmed1,
|
||||
/obj/machinery/flasher,
|
||||
/obj/machinery/flasher_button,
|
||||
/obj/machinery/cell_charger,
|
||||
/obj/machinery/meter,
|
||||
/obj/machinery/keycard_auth,
|
||||
/obj/machinery/airlock_sensor,
|
||||
/obj/machinery/turretid
|
||||
)
|
||||
|
||||
/obj/machinery/singularity/narsie/large
|
||||
name = "Nar-Sie"
|
||||
icon = 'icons/obj/narsie.dmi'
|
||||
|
||||
// Pixel stuff centers Narsie.
|
||||
pixel_x = -236
|
||||
pixel_y = -256
|
||||
|
||||
current_size = 12
|
||||
consume_range = 12 // How many tiles out do we eat.
|
||||
var/announce=1
|
||||
|
||||
/obj/machinery/singularity/narsie/large/New(var/cultspawn=0)
|
||||
..()
|
||||
if(announce)
|
||||
world << "<font size='15' color='red'><b>[uppertext(name)] HAS RISEN</b></font>"
|
||||
|
||||
if (emergency_shuttle)
|
||||
emergency_shuttle.incall(0.3) // Cannot recall.
|
||||
|
||||
if(cultspawn)
|
||||
SetUniversalState(/datum/universal_state/hell)
|
||||
|
||||
/obj/machinery/singularity/narsie/process()
|
||||
eat()
|
||||
|
||||
if (!target || prob(5))
|
||||
pickcultist()
|
||||
|
||||
move()
|
||||
|
||||
if (prob(25))
|
||||
mezzer()
|
||||
|
||||
/obj/machinery/singularity/narsie/mezzer()
|
||||
for(var/mob/living/carbon/M in oviewers(8, src))
|
||||
if(M.stat == CONSCIOUS)
|
||||
if(!iscultist(M))
|
||||
M << "\red You feel your sanity crumble away in an instant as you gaze upon [src.name]..."
|
||||
M.apply_effect(3, STUN)
|
||||
|
||||
|
||||
/obj/machinery/singularity/narsie/consume(const/atom/A) //Has its own consume proc because it doesn't need energy and I don't want BoHs to explode it. --NEO
|
||||
//NEW BEHAVIOUR
|
||||
if(narsie_behaviour == "CultStation13")
|
||||
if (is_type_in_list(A, uneatable_narsie))
|
||||
return 0
|
||||
//MOB PROCESSING
|
||||
if (istype(A, /mob/living/))
|
||||
var/mob/living/M = A
|
||||
if(iscultist(M) && M.client)
|
||||
var/pickedpath = pick(construct_types)
|
||||
var/mob/living/simple_animal/construct/C = new pickedpath(get_turf(M))
|
||||
M.mind.transfer_to(C)
|
||||
M.dust()
|
||||
//ITEM PROCESSING
|
||||
else if (istype(A, /obj/))
|
||||
if(istype(A, /obj/item/))
|
||||
if(istype(A, /obj/item/weapon/table_parts))
|
||||
new /obj/item/weapon/table_parts/wood(A.loc)
|
||||
else if(istype(A, /obj/item/device/flashlight/lamp))
|
||||
new /obj/structure/cult/pylon(A.loc)
|
||||
else if(istype(A, /obj/machinery/) && !is_type_in_list(A, trash_machinery))
|
||||
if(istype(A, /obj/machinery/light))
|
||||
new /obj/structure/cult/pylon(A.loc)
|
||||
else if((istype(A, /obj/machinery/computer)) || (istype(A, /obj/machinery/librarycomp)))
|
||||
new /obj/structure/cult/tome(A.loc)
|
||||
else if(istype(A, /obj/machinery/cooking))
|
||||
new /obj/structure/cult/talisman(A.loc)
|
||||
else if(istype(A, /obj/machinery/vending))
|
||||
new /obj/structure/cult/forge(A.loc)
|
||||
else if(istype(A, /obj/machinery/door/unpowered/shuttle))
|
||||
new /obj/structure/mineral_door/wood(A.loc)
|
||||
else if(!istype(A, /obj/machinery/door))
|
||||
var/I = pick(random_structure)
|
||||
new I(A.loc)
|
||||
if (A && !istype(A, /obj/structure/reagent_dispensers/fueltank))
|
||||
A.ex_act(1)
|
||||
else if(istype(A, /obj/structure/))
|
||||
if(istype(A, /obj/structure/grille))
|
||||
var/turf/F0 = get_turf(A)
|
||||
F0.ChangeTurf(/turf/simulated/wall/cult)
|
||||
var/turf/simulated/wall/cult/F1 = F0
|
||||
F1.del_suppress_resmoothing=1 // Reduce lag from wallsmoothing.
|
||||
else if(istype(A, /obj/structure/table))
|
||||
new /obj/structure/table/woodentable(A.loc)
|
||||
else if(istype(A, /obj/structure/shuttle/engine/propulsion))
|
||||
var/turf/F20 = get_turf(A)
|
||||
F20.ChangeTurf(/turf/simulated/wall/cult)
|
||||
var/turf/simulated/wall/cult/F21 = F20
|
||||
F21.del_suppress_resmoothing=1
|
||||
else if(istype(A, /obj/structure/shuttle/engine/heater))
|
||||
new /obj/structure/cult/pylon(A.loc)
|
||||
else if(istype(A, /obj/structure/stool))
|
||||
var/obj/structure/stool/bed/chair/wood/wings/I2 = new /obj/structure/stool/bed/chair/wood/wings(A.loc)
|
||||
I2.dir = A.dir
|
||||
if (A && !istype(A, /obj/structure/reagent_dispensers/fueltank))
|
||||
A.ex_act(1)
|
||||
if (A)
|
||||
qdel(A)
|
||||
|
||||
//TURF PROCESSING
|
||||
else if (isturf(A))
|
||||
var/dist = get_dist(A, src)
|
||||
|
||||
for (var/atom/movable/AM in A.contents)
|
||||
if (AM == src) // This is the snowflake.
|
||||
continue
|
||||
|
||||
if (dist <= consume_range)
|
||||
consume(AM)
|
||||
continue
|
||||
|
||||
if (dist > consume_range && canPull(AM))
|
||||
if (is_type_in_list(AM, uneatable_narsie))
|
||||
continue
|
||||
|
||||
if (101 == AM.invisibility)
|
||||
continue
|
||||
|
||||
spawn (0)
|
||||
step_towards(AM, src)
|
||||
|
||||
if (dist <= consume_range && !istype(A, /turf/space))
|
||||
var/turf/T = A
|
||||
if (istype(T,/turf/simulated/shuttle/wall))
|
||||
T.icon = 'icons/turf/walls.dmi'
|
||||
T.icon_state = "cult"
|
||||
else if(istype(T,/turf/simulated/wall)|| istype(T,/turf/unsimulated/wall))
|
||||
var/turf/simulated/wall/W = T
|
||||
if(!istype(T,/turf/unsimulated/wall))
|
||||
W.del_suppress_resmoothing=1 // Reduce lag from wallsmoothing.
|
||||
W.ChangeTurf(/turf/simulated/wall/cult)
|
||||
else if(istype(T,/turf/simulated/floor) || istype(T,/turf/simulated/shuttle/floor) || istype(T,/turf/simulated/shuttle/floor4) || istype(T,/turf/unsimulated/floor))
|
||||
var/turf/simulated/floor/F = T
|
||||
F.ChangeTurf(/turf/simulated/floor/engine/cult)
|
||||
else if(!istype(T,/turf/unsimulated/beach))
|
||||
T.ChangeTurf(/turf/space)
|
||||
//OLD BEHAVIOUR
|
||||
else if(narsie_behaviour == "Nar-Singulo")
|
||||
if (is_type_in_list(A, uneatable))
|
||||
return 0
|
||||
|
||||
if (istype(A, /mob/living/))
|
||||
var/mob/living/C2 = A
|
||||
C2.dust() // Changed from gib(), just for less lag.
|
||||
|
||||
else if (istype(A, /obj/))
|
||||
A.ex_act(1)
|
||||
|
||||
if (A)
|
||||
qdel(A)
|
||||
else if (isturf(A))
|
||||
var/dist = get_dist(A, src)
|
||||
|
||||
for (var/atom/movable/AM2 in A.contents)
|
||||
if (AM2 == src) // This is the snowflake.
|
||||
continue
|
||||
|
||||
if (dist <= consume_range)
|
||||
consume(AM2)
|
||||
continue
|
||||
|
||||
if (dist > consume_range && canPull(AM2))
|
||||
if (is_type_in_list(AM2, uneatable))
|
||||
continue
|
||||
|
||||
if (101 == AM2.invisibility)
|
||||
continue
|
||||
|
||||
spawn (0)
|
||||
step_towards(AM2, src)
|
||||
|
||||
if (dist <= consume_range && !istype(A, /turf/space))
|
||||
var/turf/T2 = A
|
||||
T2.ChangeTurf(/turf/space)
|
||||
|
||||
/obj/machinery/singularity/narsie/ex_act(severity) //No throwing bombs at it either. --NEO
|
||||
return
|
||||
|
||||
/obj/machinery/singularity/narsie/proc/pickcultist() //Narsie rewards his cultists with being devoured first, then picks a ghost to follow. --NEO
|
||||
var/list/cultists = list()
|
||||
for(var/datum/mind/cult_nh_mind in ticker.mode.cult)
|
||||
if(!cult_nh_mind.current)
|
||||
continue
|
||||
if(cult_nh_mind.current.stat)
|
||||
continue
|
||||
var/turf/pos = get_turf(cult_nh_mind.current)
|
||||
if(pos.z != src.z)
|
||||
continue
|
||||
cultists += cult_nh_mind.current
|
||||
if(cultists.len)
|
||||
acquire(pick(cultists))
|
||||
return
|
||||
//If there was living cultists, it picks one to follow.
|
||||
for(var/mob/living/carbon/human/food in living_mob_list)
|
||||
if(food.stat)
|
||||
continue
|
||||
var/turf/pos = get_turf(food)
|
||||
if(pos.z != src.z)
|
||||
continue
|
||||
cultists += food
|
||||
if(cultists.len)
|
||||
acquire(pick(cultists))
|
||||
return
|
||||
//no living cultists, pick a living human instead.
|
||||
for(var/mob/dead/observer/ghost in player_list)
|
||||
if(!ghost.client)
|
||||
continue
|
||||
var/turf/pos = get_turf(ghost)
|
||||
if(pos.z != src.z)
|
||||
continue
|
||||
cultists += ghost
|
||||
if(cultists.len)
|
||||
acquire(pick(cultists))
|
||||
return
|
||||
//no living humans, follow a ghost instead.
|
||||
|
||||
/obj/machinery/singularity/narsie/proc/acquire(const/mob/food)
|
||||
var/capname = uppertext(name)
|
||||
|
||||
target << "\blue <b>[capname] HAS LOST INTEREST IN YOU.</b>"
|
||||
target = food
|
||||
|
||||
if (ishuman(target))
|
||||
target << "\red <b>[capname] HUNGERS FOR YOUR SOUL.</b>"
|
||||
else
|
||||
target << "\red <b>[capname] HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL.</b>"
|
||||
|
||||
/**
|
||||
* Wizard narsie.
|
||||
*/
|
||||
/obj/machinery/singularity/narsie/wizard
|
||||
grav_pull = 0
|
||||
|
||||
/obj/machinery/singularity/narsie/wizard/eat()
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
if (defer_powernet_rebuild != 2)
|
||||
defer_powernet_rebuild = 1
|
||||
|
||||
for (var/turf/T in trange(consume_range, src))
|
||||
consume(T)
|
||||
|
||||
if (defer_powernet_rebuild != 2)
|
||||
defer_powernet_rebuild = 0
|
||||
|
||||
/**
|
||||
* MR. CLEAN
|
||||
*/
|
||||
var/global/mr_clean_targets = list(
|
||||
/obj/effect/decal/cleanable,
|
||||
/obj/effect/decal/mecha_wreckage,
|
||||
/obj/effect/decal/remains,
|
||||
/obj/effect/spacevine,
|
||||
/obj/effect/spacevine_controller,
|
||||
/obj/effect/biomass,
|
||||
/obj/effect/biomass_controller,
|
||||
/obj/effect/rune,
|
||||
/obj/effect/blob,
|
||||
/obj/effect/spider
|
||||
)
|
||||
|
||||
/obj/machinery/singularity/narsie/large/clean // Mr. Clean.
|
||||
name = "Mr. Clean"
|
||||
desc = "This universe is dirty. Time to change that."
|
||||
icon = 'icons/obj/mrclean.dmi'
|
||||
icon_state = ""
|
||||
|
||||
/obj/machinery/singularity/narsie/large/clean/update_icon()
|
||||
overlays = 0
|
||||
|
||||
if (target && !isturf(target))
|
||||
overlays += "eyes"
|
||||
|
||||
/obj/machinery/singularity/narsie/large/clean/acquire(var/mob/food)
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/singularity/narsie/large/clean/consume(const/atom/A)
|
||||
if (is_type_in_list(A, uneatable))
|
||||
return 0
|
||||
|
||||
if (istype(A, /mob/living/))
|
||||
if (isrobot(A))
|
||||
var/mob/living/silicon/robot/R = A
|
||||
|
||||
if (R.mmi)
|
||||
del(R.mmi) // Nuke MMI.
|
||||
qdel(A) // Just delete it.
|
||||
else if (is_type_in_list(A, mr_clean_targets))
|
||||
qdel(A)
|
||||
else if (isturf(A))
|
||||
var/turf/T = A
|
||||
T.clean_blood()
|
||||
var/dist = get_dist(T, src)
|
||||
|
||||
for (var/atom/movable/AM in T.contents)
|
||||
if (AM == src) // This is the snowflake.
|
||||
continue
|
||||
|
||||
if (dist <= consume_range)
|
||||
consume(AM)
|
||||
continue
|
||||
|
||||
if (dist > consume_range && canPull(AM))
|
||||
if (is_type_in_list(AM, uneatable))
|
||||
continue
|
||||
|
||||
if (101 == AM.invisibility)
|
||||
continue
|
||||
|
||||
spawn (0)
|
||||
step_towards(AM, src)
|
||||
|
||||
/*
|
||||
* Mr. Clean just follows the dirt and grime.
|
||||
*/
|
||||
/obj/machinery/singularity/narsie/large/clean/pickcultist()
|
||||
var/list/targets = list()
|
||||
for(var/obj/effect/E in world)
|
||||
if(is_type_in_list(E, mr_clean_targets) && E.z == src.z)
|
||||
targets += E
|
||||
if(targets.len)
|
||||
acquire(pick(targets))
|
||||
return
|
||||
@@ -458,248 +458,3 @@ var/global/list/uneatable = list(
|
||||
if (get_dist(R, src) <= 15) // Better than using orange() every process.
|
||||
R.receive_pulse(energy)
|
||||
|
||||
/obj/machinery/singularity/narsie // Moving narsie to a child object of the singularity so it can be made to function differently. --NEO.
|
||||
name = "Nar-Sie"
|
||||
desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees."
|
||||
icon = 'icons/obj/magic_terror.dmi'
|
||||
pixel_x = -89
|
||||
pixel_y = -85
|
||||
|
||||
current_size = 9 //It moves/eats like a max-size singulo, aside from range. --NEO.
|
||||
contained = 0 // Are we going to move around?
|
||||
dissipate = 0 // Do we lose energy over time?
|
||||
grav_pull = 10 //How many tiles out do we pull?
|
||||
consume_range = 3 //How many tiles out do we eat
|
||||
|
||||
/obj/machinery/singularity/narsie/large
|
||||
name = "Nar-Sie"
|
||||
icon = 'icons/obj/narsie.dmi'
|
||||
|
||||
// Pixel stuff centers Narsie.
|
||||
pixel_x = -236
|
||||
pixel_y = -256
|
||||
|
||||
current_size = 12
|
||||
consume_range = 12 // How many tiles out do we eat.
|
||||
var/announce=1
|
||||
|
||||
/obj/machinery/singularity/narsie/large/New(var/cultspawn=0)
|
||||
..()
|
||||
if(announce)
|
||||
world << "<font size='15' color='red'><b>[uppertext(name)] HAS RISEN</b></font>"
|
||||
|
||||
if (emergency_shuttle)
|
||||
emergency_shuttle.incall(0.3) // Cannot recall.
|
||||
|
||||
if(cultspawn)
|
||||
SetUniversalState(/datum/universal_state/hell)
|
||||
|
||||
/obj/machinery/singularity/narsie/process()
|
||||
eat()
|
||||
|
||||
if (!target || prob(5))
|
||||
pickcultist()
|
||||
|
||||
move()
|
||||
|
||||
if (prob(25))
|
||||
mezzer()
|
||||
|
||||
/obj/machinery/singularity/narsie/mezzer()
|
||||
for(var/mob/living/carbon/M in oviewers(8, src))
|
||||
if(M.stat == CONSCIOUS)
|
||||
if(!iscultist(M))
|
||||
M << "\red You feel your sanity crumble away in an instant as you gaze upon [src.name]..."
|
||||
M.apply_effect(3, STUN)
|
||||
|
||||
|
||||
/obj/machinery/singularity/narsie/consume(const/atom/A) //Has its own consume proc because it doesn't need energy and I don't want BoHs to explode it. --NEO
|
||||
if (is_type_in_list(A, uneatable))
|
||||
return 0
|
||||
|
||||
if (istype(A, /mob/living/))
|
||||
var/mob/living/C = A
|
||||
C.dust() // Changed from gib(), just for less lag.
|
||||
|
||||
else if (istype(A, /obj/))
|
||||
A.ex_act(1)
|
||||
|
||||
if (A)
|
||||
qdel(A)
|
||||
else if (isturf(A))
|
||||
var/dist = get_dist(A, src)
|
||||
|
||||
for (var/atom/movable/AM in A.contents)
|
||||
if (AM == src) // This is the snowflake.
|
||||
continue
|
||||
|
||||
if (dist <= consume_range)
|
||||
consume(AM)
|
||||
continue
|
||||
|
||||
if (dist > consume_range && canPull(AM))
|
||||
if (is_type_in_list(AM, uneatable))
|
||||
continue
|
||||
|
||||
if (101 == AM.invisibility)
|
||||
continue
|
||||
|
||||
spawn (0)
|
||||
step_towards(AM, src)
|
||||
|
||||
if (dist <= consume_range && !istype(A, /turf/space))
|
||||
var/turf/T = A
|
||||
if(istype(T,/turf/simulated/wall))
|
||||
var/turf/simulated/wall/W = T
|
||||
W.del_suppress_resmoothing=1 // Reduce lag from wallsmoothing.
|
||||
T.ChangeTurf(/turf/space)
|
||||
|
||||
/obj/machinery/singularity/narsie/ex_act(severity) //No throwing bombs at it either. --NEO
|
||||
return
|
||||
|
||||
/obj/machinery/singularity/narsie/proc/pickcultist() //Narsie rewards his cultists with being devoured first, then picks a ghost to follow. --NEO
|
||||
var/list/cultists = list()
|
||||
for(var/datum/mind/cult_nh_mind in ticker.mode.cult)
|
||||
if(!cult_nh_mind.current)
|
||||
continue
|
||||
if(cult_nh_mind.current.stat)
|
||||
continue
|
||||
var/turf/pos = get_turf(cult_nh_mind.current)
|
||||
if(pos.z != src.z)
|
||||
continue
|
||||
cultists += cult_nh_mind.current
|
||||
if(cultists.len)
|
||||
acquire(pick(cultists))
|
||||
return
|
||||
//If there was living cultists, it picks one to follow.
|
||||
for(var/mob/living/carbon/human/food in living_mob_list)
|
||||
if(food.stat)
|
||||
continue
|
||||
var/turf/pos = get_turf(food)
|
||||
if(pos.z != src.z)
|
||||
continue
|
||||
cultists += food
|
||||
if(cultists.len)
|
||||
acquire(pick(cultists))
|
||||
return
|
||||
//no living cultists, pick a living human instead.
|
||||
for(var/mob/dead/observer/ghost in player_list)
|
||||
if(!ghost.client)
|
||||
continue
|
||||
var/turf/pos = get_turf(ghost)
|
||||
if(pos.z != src.z)
|
||||
continue
|
||||
cultists += ghost
|
||||
if(cultists.len)
|
||||
acquire(pick(cultists))
|
||||
return
|
||||
//no living humans, follow a ghost instead.
|
||||
|
||||
/obj/machinery/singularity/narsie/proc/acquire(const/mob/food)
|
||||
var/capname = uppertext(name)
|
||||
|
||||
target << "\blue <b>[capname] HAS LOST INTEREST IN YOU.</b>"
|
||||
target = food
|
||||
|
||||
if (ishuman(target))
|
||||
target << "\red <b>[capname] HUNGERS FOR YOUR SOUL.</b>"
|
||||
else
|
||||
target << "\red <b>[capname] HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL.</b>"
|
||||
|
||||
/**
|
||||
* Wizard narsie.
|
||||
*/
|
||||
/obj/machinery/singularity/narsie/wizard
|
||||
grav_pull = 0
|
||||
|
||||
/obj/machinery/singularity/narsie/wizard/eat()
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
if (defer_powernet_rebuild != 2)
|
||||
defer_powernet_rebuild = 1
|
||||
|
||||
for (var/turf/T in trange(consume_range, src))
|
||||
consume(T)
|
||||
|
||||
if (defer_powernet_rebuild != 2)
|
||||
defer_powernet_rebuild = 0
|
||||
|
||||
/**
|
||||
* MR. CLEAN
|
||||
*/
|
||||
var/global/mr_clean_targets = list(
|
||||
/obj/effect/decal/cleanable,
|
||||
/obj/effect/decal/mecha_wreckage,
|
||||
/obj/effect/decal/remains,
|
||||
/obj/effect/spacevine,
|
||||
/obj/effect/spacevine_controller,
|
||||
/obj/effect/biomass,
|
||||
/obj/effect/biomass_controller,
|
||||
/obj/effect/rune,
|
||||
/obj/effect/blob,
|
||||
/obj/effect/spider
|
||||
)
|
||||
|
||||
/obj/machinery/singularity/narsie/large/clean // Mr. Clean.
|
||||
name = "Mr. Clean"
|
||||
desc = "This universe is dirty. Time to change that."
|
||||
icon = 'icons/obj/mrclean.dmi'
|
||||
icon_state = ""
|
||||
|
||||
/obj/machinery/singularity/narsie/large/clean/update_icon()
|
||||
overlays = 0
|
||||
|
||||
if (target && !isturf(target))
|
||||
overlays += "eyes"
|
||||
|
||||
/obj/machinery/singularity/narsie/large/clean/acquire(var/mob/food)
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/singularity/narsie/large/clean/consume(const/atom/A)
|
||||
if (is_type_in_list(A, uneatable))
|
||||
return 0
|
||||
|
||||
if (istype(A, /mob/living/))
|
||||
if (isrobot(A))
|
||||
var/mob/living/silicon/robot/R = A
|
||||
|
||||
if (R.mmi)
|
||||
del(R.mmi) // Nuke MMI.
|
||||
qdel(A) // Just delete it.
|
||||
else if (is_type_in_list(A, mr_clean_targets))
|
||||
qdel(A)
|
||||
else if (isturf(A))
|
||||
var/turf/T = A
|
||||
T.clean_blood()
|
||||
var/dist = get_dist(T, src)
|
||||
|
||||
for (var/atom/movable/AM in T.contents)
|
||||
if (AM == src) // This is the snowflake.
|
||||
continue
|
||||
|
||||
if (dist <= consume_range)
|
||||
consume(AM)
|
||||
continue
|
||||
|
||||
if (dist > consume_range && canPull(AM))
|
||||
if (is_type_in_list(AM, uneatable))
|
||||
continue
|
||||
|
||||
if (101 == AM.invisibility)
|
||||
continue
|
||||
|
||||
spawn (0)
|
||||
step_towards(AM, src)
|
||||
|
||||
/*
|
||||
* Mr. Clean just follows the dirt and grime.
|
||||
*/
|
||||
/obj/machinery/singularity/narsie/large/clean/pickcultist()
|
||||
var/list/targets = list()
|
||||
for(var/obj/effect/E in world)
|
||||
if(is_type_in_list(E, mr_clean_targets) && E.z == src.z)
|
||||
targets += E
|
||||
if(targets.len)
|
||||
acquire(pick(targets))
|
||||
return
|
||||
@@ -1,3 +1,15 @@
|
||||
author: Deity Link
|
||||
changes: []
|
||||
delete-after: false
|
||||
delete-after: true
|
||||
changes:
|
||||
- tweak: tweaked the Pylon, Forge, and Tome sprites of cult.dmi (set their animation speeds to much nicer looking onces)
|
||||
- tweak: Red Pylons light color now bright red.
|
||||
- tweak: Red Pylons can now be broken like light fixtures leaving a passable broken pylon that can be attacked again to completely erase it.
|
||||
- rscadd: Artificers now have a "Red Pylon" spell. 10 seconds cooldown. Places a Red Pylon (or repair a broken one) under them.<br>Pylons have collisions but can be broken very easily even bare-handed. Their main use is as a light source.
|
||||
- tweak: when floor tiles periodically decay once <span class="redletter">narsie has risen</span>, they will now spawn a Pylon in place of any light fixtures that were on that tile
|
||||
- imageadd: <span class="redletter">NARSIE HAS GOTTEN A NEW LOOK</span>, upgraded sprites for narsie, now with twice more pixels!
|
||||
- tweak: moved narsie's code to its own .dm .
|
||||
- rscadd: coded new interactions with the environnement for <span class="redletter">narsie</span>:<br>Floor tiles (except carpets) and Wall tiles are replaced with their cult counterparts.<br>Grilles are replaced with cult walls.<br>Light bulbs are replaced with Red Pylons.<br>Most machines and all computers get replaced by various cult structures, unused up to now.<br>Cultists become constructs on contact with narsie.
|
||||
- tweak: the monsters spawned across the universe once <span class="redletter">narsie has risen</span> aren't affected by narsie, and do not attack constructs or cultists either.
|
||||
- rscadd: once the shuttle docks after <span class="redletter">narsie has risen</span>, All the monsters will make their way toward the station's escape hallway.
|
||||
- rscadd: added a button in the Admin Secret menu that lets them choose <span class="redletter">narsie</span>'s behaviour (either the above mentionned new interactions, or going back to the old oversized singulo. Defaults with the new interactions).
|
||||
- tweak: once <span class="redletter">narsie has risen</span>, the rune count cap is increased by 9000. Mostly for fluff.
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 12 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 219 KiB |
Reference in New Issue
Block a user