Files
Bubberstation/code/game/gamemodes/handofgod/structures.dm

662 lines
20 KiB
Plaintext

/proc/build_hog_construction_lists()
if(global_handofgod_traptypes.len && global_handofgod_structuretypes.len)
return
var/list/types = subtypesof(/obj/structure/divine) - /obj/structure/divine/trap
for(var/T in types)
var/obj/structure/divine/D = T
if(initial(D.constructable))
if(initial(D.trap))
global_handofgod_traptypes[initial(D.name)] = T
else
global_handofgod_structuretypes[initial(D.name)] = T
/obj/structure/divine
name = "divine construction site"
icon = 'icons/obj/hand_of_god_structures.dmi'
desc = "An unfinished divine building"
anchored = 1
density = 1
var/constructable = TRUE
var/trap = FALSE
var/metal_cost = 0
var/glass_cost = 0
var/lesser_gem_cost = 0
var/greater_gem_cost = 0
var/mob/camera/god/deity
var/side = "neutral" //"blue" or "red", also used for colouring structures when construction is started by a deity
var/health = 100
var/maxhealth = 100
var/deactivated = 0 //Structures being hidden can't be used. Mainly to prevent invisible defense pylons.
var/autocolours = TRUE //do we colour to our side?
/obj/structure/divine/New()
..()
/obj/structure/divine/proc/deactivate()
deactivated = 1
/obj/structure/divine/proc/activate()
deactivated = 0
/obj/structure/divine/proc/update_icons()
if(autocolours)
icon_state = "[initial(icon_state)]-[side]"
/obj/structure/divine/Destroy()
if(deity)
deity.structures -= src
return ..()
/obj/structure/divine/attackby(obj/item/I, mob/user)
//Structure conversion/capture
if(istype(I, /obj/item/weapon/godstaff))
if(!is_handofgod_cultist(user))
user << "<span class='notice'>You're not quite sure what the hell you're even doing.</span>"
return
var/obj/item/weapon/godstaff/G = I
if(G.god && deity != G.god)
assign_deity(G.god, alert_old_deity = TRUE)
visible_message("<span class='boldnotice'>\The [src] has been captured by [user]!</span>")
else
return ..()
/obj/structure/divine/attacked_by(obj/item/I, mob/living/user)
..()
take_damage(I.force, I.damtype, 1)
/obj/structure/divine/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
switch(damage_type)
if(BRUTE)
if(sound_effect)
if(damage)
playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
else
playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
if(BURN)
if(sound_effect)
playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
else
return
health -= damage
if(!health)
visible_message("<span class='danger'>\The [src] was destroyed!</span>")
qdel(src)
/obj/structure/divine/bullet_act(obj/item/projectile/P)
. = ..()
take_damage(P.damage, P.damage_type, 0)
/obj/structure/divine/attack_alien(mob/living/carbon/alien/humanoid/user)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
add_hiddenprint(user)
visible_message("<span class='warning'>\The [user] slashes at [src]!</span>")
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
take_damage(20, BRUTE, 0)
/obj/machinery/attack_animal(mob/living/simple_animal/M)
M.changeNext_move(CLICK_CD_MELEE)
M.do_attack_animation(src)
if(M.melee_damage_upper > 0 || M.obj_damage)
M.visible_message("<span class='danger'>[M.name] smashes against \the [src.name].</span>",\
"<span class='danger'>You smash against the [src.name].</span>")
if(M.obj_damage)
take_damage(M.obj_damage, M.melee_damage_type, 1)
else
take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, 1)
/obj/structure/divine/proc/assign_deity(mob/camera/god/new_deity, alert_old_deity = TRUE)
if(!new_deity)
return 0
if(deity)
if(alert_old_deity)
deity << "<span class='danger'><B>Your [name] was captured by [new_deity]'s cult!</B></span>"
deity.structures -= src
deity = new_deity
deity.structures |= src
side = deity.side
update_icons()
return 1
/obj/structure/divine/construction_holder
alpha = 125
constructable = FALSE
var/obj/structure/divine/construction_result = /obj/structure/divine //a path, but typed to /obj/structure/divine for initial()
/obj/structure/divine/construction_holder/assign_deity(mob/camera/god/new_deity, alert_old_deity = TRUE)
if(..())
color = side
/obj/structure/divine/construction_holder/attack_god(mob/camera/god/user)
if(user.side == side && construction_result)
user.add_faith(75)
visible_message("<span class='danger'>[user] has cancelled \the [initial(construction_result.name)]")
qdel(src)
/obj/structure/divine/construction_holder/proc/setup_construction(construct_type)
if(ispath(construct_type))
construction_result = construct_type
name = "[initial(construction_result.name)] construction site "
icon_state = initial(construction_result.icon_state)
metal_cost = initial(construction_result.metal_cost)
glass_cost = initial(construction_result.glass_cost)
lesser_gem_cost = initial(construction_result.lesser_gem_cost)
greater_gem_cost = initial(construction_result.greater_gem_cost)
desc = "An unfinished [initial(construction_result.name)]."
/obj/structure/divine/construction_holder/attackby(obj/item/I, mob/user)
if(!I || !user)
return 0
if(istype(I, /obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/M = I
if(metal_cost)
var/spend = min(metal_cost, M.amount)
user << "<span class='notice'>You add [spend] metal to \the [src]."
metal_cost = max(0, metal_cost - spend)
M.use(spend)
check_completion()
else
user << "<span class='notice'>\The [src] does not require any more metal!"
return
if(istype(I, /obj/item/stack/sheet/glass))
var/obj/item/stack/sheet/glass/G = I
if(glass_cost)
var/spend = min(glass_cost, G.amount)
user << "<span class='notice'>You add [spend] glass to \the [src]."
glass_cost = max(0, glass_cost - spend)
G.use(spend)
check_completion()
else
user << "<span class='notice'>\The [src] does not require any more glass!"
return
if(istype(I, /obj/item/stack/sheet/lessergem))
var/obj/item/stack/sheet/lessergem/LG = I
if(lesser_gem_cost)
var/spend = min(lesser_gem_cost, LG.amount)
user << "<span class='notice'>You add [spend] lesser gems to \the [src]."
lesser_gem_cost = max(0, lesser_gem_cost - spend)
LG.use(spend)
check_completion()
else
user << "<span class='notice'>\The [src] does not require any more lesser gems!"
return
if(istype(I, /obj/item/stack/sheet/greatergem))
var/obj/item/stack/sheet/greatergem/GG = I //GG!
if(greater_gem_cost)
var/spend = min(greater_gem_cost, GG.amount)
user << "<span class='notice'>You add [spend] greater gems to \the [src]."
greater_gem_cost = max(0, greater_gem_cost - spend)
GG.use(spend)
check_completion()
else
user << "<span class='notice'>\The [src] does not require any more greater gems!"
return
else
return ..()
/obj/structure/divine/construction_holder/proc/check_completion()
if(!metal_cost && !glass_cost && !lesser_gem_cost && !greater_gem_cost)
visible_message("<span class='notice'>\The [initial(construction_result.name)] is complete!</span>")
var/obj/structure/divine/D = new construction_result (get_turf(src))
D.assign_deity(deity)
qdel(src)
/obj/structure/divine/construction_holder/examine(mob/user)
..()
if(metal_cost || glass_cost || lesser_gem_cost || greater_gem_cost)
user << "To finish construction it requires the following materials:"
if(metal_cost)
user << "[metal_cost] metal <IMG CLASS=icon SRC=icons/obj/items.dmi ICONSTATE='sheet-metal'>"
if(glass_cost)
user << "[glass_cost] glass <IMG CLASS=icon SRC=icons/obj/items.dmi ICONSTATE='sheet-glass'>"
if(lesser_gem_cost)
user << "[lesser_gem_cost] lesser gems <IMG CLASS=icon SRC=icons/obj/items.dmi ICONSTATE='sheet-lessergem'>"
if(greater_gem_cost)
user << "[greater_gem_cost] greater gems <IMG CLASS=icon SRC=icons/obj/items.dmi ICONSTATE='sheet-greatergem'>"
/obj/structure/divine/nexus
name = "nexus"
desc = "It anchors a deity to this world. It radiates an unusual aura. Cultists protect this at all costs. It looks well protected from explosive shock."
icon_state = "nexus"
health = 500
maxhealth = 500
constructable = FALSE
var/faith_regen_rate = 1
var/list/powerpylons = list()
/obj/structure/divine/nexus/ex_act()
return
/obj/structure/divine/nexus/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
switch(damage_type)
if(BRUTE)
if(sound_effect)
if(damage)
playsound(loc, 'sound/weapons/smash.ogg', 50, 1)
else
playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
if(BURN)
if(sound_effect)
playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
else
return
health -= damage
if(deity)
deity.update_health_hud()
if(!health)
if(!qdeleted(deity) && deity.nexus_required)
deity << "<span class='danger'>Your nexus was destroyed. You feel yourself fading...</span>"
qdel(deity)
visible_message("<span class='danger'>\The [src] was destroyed!</span>")
qdel(src)
/obj/structure/divine/nexus/New()
START_PROCESSING(SSobj, src)
/obj/structure/divine/nexus/process()
if(deity)
deity.update_followers()
deity.add_faith(faith_regen_rate + (powerpylons.len / 5) + (deity.alive_followers / 3))
deity.max_faith = initial(deity.max_faith) + (deity.alive_followers*10) //10 followers = 100 max faith, so disaster() at around 20 followers
deity.check_death()
/obj/structure/divine/nexus/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/structure/divine/conduit
name = "conduit"
desc = "It allows a deity to extend their reach. Their powers are just as potent near a conduit as a nexus."
icon_state = "conduit"
health = 150
maxhealth = 150
metal_cost = 10
glass_cost = 5
/obj/structure/divine/conduit/assign_deity(mob/camera/god/new_deity, alert_old_deity = TRUE)
if(deity)
deity.conduits -= src
..()
if(deity)
deity.conduits += src
/obj/structure/divine/conduit/deactivate()
..()
if(deity)
deity.conduits -= src
/obj/structure/divine/conduit/activate()
..()
if(deity)
deity.conduits += src
/* //No good sprites, and not enough items to make it viable yet
/obj/structure/divine/forge
name = "forge"
desc = "A forge fueled by divine might, it allows the creation of sacred and powerful artifacts. It requires common materials to craft objects."
icon_state = "forge"
health = 250
maxhealth = 250
density = 0
maxhealth = 250
metal_cost = 40
*/
/obj/structure/divine/convertaltar
name = "conversion altar"
desc = "An altar dedicated to a deity. Cultists can \"forcefully teach\" their non-aligned crewmembers to join their side and take up their deity."
icon_state = "convertaltar"
density = 0
metal_cost = 10
can_buckle = 1
/obj/structure/divine/convertaltar/attack_hand(mob/living/user)
..()
if(deactivated)
return
var/mob/living/carbon/human/H = locate() in get_turf(src)
if(!is_handofgod_cultist(user))
user << "<span class='notice'>You try to use it, but unfortunately you don't know any rituals.</span>"
return
if(!H)
return
if(!H.mind)
user << "<span class='danger'>Only sentients may serve your deity.</span>"
return
if((side == "red" && is_handofgod_redcultist(user) && !is_handofgod_redcultist(H)) || (side == "blue" && is_handofgod_bluecultist(user) && !is_handofgod_bluecultist(H)))
user << "<span class='notice'>You invoke the conversion ritual.</span>"
ticker.mode.add_hog_follower(H.mind, side)
else
user << "<span class='notice'>You invoke the conversion ritual.</span>"
user << "<span class='danger'>But the altar ignores your words...</span>"
/obj/structure/divine/sacrificealtar
name = "sacrificial altar"
desc = "An altar designed to perform blood sacrifice for a deity. The cultists performing the sacrifice will gain a powerful material to use in their forge. Sacrificing a prophet will yield even better results."
icon_state = "sacrificealtar"
density = 0
metal_cost = 15
can_buckle = 1
/obj/structure/divine/sacrificealtar/attack_hand(mob/living/user)
..()
if(deactivated)
return
var/mob/living/L = locate() in get_turf(src)
if(!is_handofgod_cultist(user))
user << "<span class='notice'>You try to use it, but unfortunately you don't know any rituals.</span>"
return
if(!L)
return
if((side == "red" && is_handofgod_redcultist(user)) || (side == "blue" && is_handofgod_bluecultist(user)))
if((side == "red" && is_handofgod_redcultist(L)) || (side == "blue" && is_handofgod_bluecultist(L)))
user << "<span class='danger'>You cannot sacrifice a fellow cultist.</span>"
return
user << "<span class='notice'>You attempt to sacrifice [L] by invoking the sacrificial ritual.</span>"
sacrifice(L)
else
user << "<span class='notice'>You attempt to sacrifice [L] by invoking the sacrificial ritual.</span>"
user << "<span class='danger'>But the altar ignores your words...</span>"
/obj/structure/divine/sacrificealtar/proc/sacrifice(mob/living/L)
if(!L)
L = locate() in get_turf(src)
if(L)
if(ismonkey(L))
var/luck = rand(1,4)
if(luck > 3)
new /obj/item/stack/sheet/lessergem(get_turf(src))
else if(ishuman(L))
var/mob/living/carbon/human/H = L
//Sacrifice altars can't teamkill
if(side == "red" && is_handofgod_redcultist(H))
return
else if(side == "blue" && is_handofgod_bluecultist(H))
return
if(is_handofgod_prophet(H))
new /obj/item/stack/sheet/greatergem(get_turf(src))
if(deity)
deity.prophets_sacrificed_in_name++
else
new /obj/item/stack/sheet/lessergem(get_turf(src))
else if(isAI(L) || istype(L, /mob/living/carbon/alien/humanoid/royal/queen))
new /obj/item/stack/sheet/greatergem(get_turf(src))
else
new /obj/item/stack/sheet/lessergem(get_turf(src))
L.gib()
/obj/structure/divine/healingfountain
name = "healing fountain"
desc = "A fountain containing the waters of life... or death, depending on where your allegiances lie."
icon_state = "fountain"
metal_cost = 10
glass_cost = 5
autocolours = FALSE
var/time_between_uses = 1800
var/last_process = 0
var/cult_only = TRUE
/obj/structure/divine/healingfountain/anyone
desc = "A fountain containing the waters of life."
cult_only = FALSE
/obj/structure/divine/healingfountain/attack_hand(mob/living/user)
if(deactivated)
return
if(last_process + time_between_uses > world.time)
user << "<span class='notice'>The fountain appears to be empty.</span>"
return
last_process = world.time
if(!is_handofgod_cultist(user) && cult_only)
user << "<span class='danger'><B>The water burns!</b></spam>"
user.reagents.add_reagent("hell_water",20)
else
user << "<span class='notice'>The water feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards.</span>"
user.reagents.add_reagent("godblood",20)
update_icons()
addtimer(src, "update_icons", time_between_uses)
/obj/structure/divine/healingfountain/update_icons()
if(last_process + time_between_uses > world.time)
icon_state = "fountain"
else
icon_state = "fountain-[side]"
/obj/structure/divine/powerpylon
name = "power pylon"
desc = "A pylon which increases the deity's rate it can influence the world."
icon_state = "powerpylon"
density = 1
health = 30
maxhealth = 30
metal_cost = 5
glass_cost = 15
/obj/structure/divine/powerpylon/New()
..()
if(deity && deity.god_nexus)
deity.god_nexus.powerpylons += src
/obj/structure/divine/powerpylon/Destroy()
if(deity && deity.god_nexus)
deity.god_nexus.powerpylons -= src
return ..()
/obj/structure/divine/powerpylon/deactivate()
..()
if(deity)
deity.god_nexus.powerpylons -= src
/obj/structure/divine/powerpylon/activate()
..()
if(deity)
deity.god_nexus.powerpylons += src
/obj/structure/divine/defensepylon
name = "defense pylon"
desc = "A pylon which is blessed to withstand many blows, and fire strong bolts at nonbelievers. A god can toggle it."
icon_state = "defensepylon"
health = 150
maxhealth = 150
metal_cost = 25
glass_cost = 30
var/obj/machinery/porta_turret/defensepylon_internal_turret/pylon_gun
/obj/structure/divine/defensepylon/New()
..()
pylon_gun = new(src)
pylon_gun.base = src
pylon_gun.faction = list("[side] god")
/obj/structure/divine/defensepylon/Destroy()
qdel(pylon_gun) //just in case
return ..()
/obj/structure/divine/defensepylon/examine(mob/user)
..()
user << "<span class='notice'>\The [src] looks [pylon_gun.on ? "on" : "off"].</span>"
/obj/structure/divine/defensepylon/assign_deity(mob/camera/god/new_deity, alert_old_deity = TRUE)
if(..() && pylon_gun)
pylon_gun.faction = list("[side] god")
pylon_gun.side = side
/obj/structure/divine/defensepylon/attack_god(mob/camera/god/user)
if(user.side == side)
if(deactivated)
user << "You need to reveal it first!"
return
pylon_gun.on = !pylon_gun.on
icon_state = (pylon_gun.on) ? "defensepylon-[side]" : "defensepylon"
/obj/structure/divine/defensepylon/deactivate()
..()
pylon_gun.on = 0
icon_state = (pylon_gun.on) ? "defensepylon-[side]" : "defensepylon"
/obj/structure/divine/defensepylon/activate()
..()
pylon_gun.on = 1
icon_state = (pylon_gun.on) ? "defensepylon-[side]" : "defensepylon"
//This sits inside the defensepylon, to avoid copypasta
/obj/machinery/porta_turret/defensepylon_internal_turret
name = "defense pylon"
desc = "A plyon which is blessed to withstand many blows, and fire strong bolts at nonbelievers."
icon = 'icons/obj/hand_of_god_structures.dmi'
installation = null
always_up = 1
use_power = 0
has_cover = 0
health = 200
projectile = /obj/item/projectile/beam/pylon_bolt
eprojectile = /obj/item/projectile/beam/pylon_bolt
shot_sound = 'sound/weapons/emitter2.ogg'
eshot_sound = 'sound/weapons/emitter2.ogg'
base_icon_state = "defensepylon"
active_state = ""
off_state = ""
faction = null
emp_vunerable = 0
var/side = "neutral"
/obj/machinery/porta_turret/defensepylon_internal_turret/setup()
return
/obj/machinery/porta_turret/defensepylon_internal_turret/shootAt(atom/movable/target)
var/obj/item/projectile/A = ..()
if(A)
A.color = side
/obj/machinery/porta_turret/defensepylon_internal_turret/assess_perp(mob/living/carbon/human/perp)
if(perp.handcuffed) //dishonourable to kill somebody who might be converted.
return 0
var/badtarget = 0
switch(side)
if("blue")
badtarget = is_handofgod_bluecultist(perp)
if("red")
badtarget = is_handofgod_redcultist(perp)
else
badtarget = 1
if(badtarget)
return 0
return 10
/obj/item/projectile/beam/pylon_bolt
name = "divine bolt"
icon_state = "greyscale_bolt"
damage = 15
/obj/structure/divine/shrine
name = "shrine"
desc = "A shrine dedicated to a deity."
icon_state = "shrine"
metal_cost = 15
glass_cost = 15
/obj/structure/divine/shrine/assign_deity(mob/camera/god/new_deity, alert_old_deity = TRUE)
if(..())
name = "shrine to [new_deity.name]"
desc = "A shrine dedicated to [new_deity.name]"
//Functional, but need sprites
/*
/obj/structure/divine/translocator
name = "translocator"
desc = "A powerful structure, made with a greater gem. It allows a deity to move their nexus to where this stands"
icon_state = "translocator"
health = 100
maxhealth = 100
metal_cost = 20
glass_cost = 20
greater_gem_cost = 1
/obj/structure/divine/lazarusaltar
name = "lazarus altar"
desc = "A very powerful altar capable of bringing life back to the recently deceased, made with a greater gem. It can revive anyone and will heal virtually all wounds, but they are but a shell of their former self."
icon_state = "lazarusaltar"
density = 0
health = 100
maxhealth = 100
metal_cost = 20
greater_gem_cost = 1
/obj/structure/divine/lazarusaltar/attack_hand(mob/living/user)
var/mob/living/L = locate() in get_turf(src)
if(!is_handofgod_culstist(user))
user << "<span class='notice'>You try to use it, but unfortunately you don't know any rituals.</span>"
return
if(!L)
return
if((side == "red" && is_handofgod_redcultist(user))) || (side == "blue" && is_handofgod_bluecultist(user)))
user << "<span class='notice'>You attempt to revive [L] by invoking the rebirth ritual.</span>"
L.revive()
L.adjustCloneLoss(50)
L.adjustStaminaLoss(100)
else
user << "<span class='notice'>You attempt to revive [L] by invoking the rebirth ritual.</span>"
user << "<span class='danger'>But the altar ignores your words...</span>"
*/