the NARSIE HAS RISEN update

This commit is contained in:
DeityLink
2014-10-18 05:32:29 +02:00
parent 7a9ccf8d6c
commit a6e93c1f95
16 changed files with 675 additions and 257 deletions

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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")

View File

@@ -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

View File

@@ -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>

View File

@@ -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")

View File

@@ -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
)

View File

@@ -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()

View File

@@ -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()

View File

@@ -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()

View 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

View File

@@ -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

View File

@@ -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