mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-23 08:31:57 +00:00
This PR revives Burger's PR #5797 Fire extinguishing foam now works properly. It is 3 times stronger than water. Walking through a foam will extenguish your fire stacks. Atmos suit max temperature threshold was increased from 30k to 40k. Atmos firefighter suit max temperature was increased from 30k to 45k. Heavy firesuit max temperature was increased from 30k to 55k. Same goes for their helmets. Firesuits and red/white/atmos hardhats no longer protect wearer from pressure. So people cannot use it in space. For areas with 2000+ KPa fire people need to use atmos voidsuit. Fixes #867 Cyborg stations now refill cyborg's fire extinguishers. Fixes #6171 Fire now produces CO2 while burning, with amount varying by fire severity
232 lines
8.6 KiB
Plaintext
232 lines
8.6 KiB
Plaintext
#define LOCKED 2
|
|
#define CAN_MAKE_CONTRACTS 4
|
|
|
|
var/list/artefact_feedback = list(/obj/structure/closet/wizard/armor = "HS",
|
|
/obj/item/weapon/gun/energy/staff/focus = "MF",
|
|
/obj/item/weapon/monster_manual = "MA",
|
|
/obj/item/weapon/contract/apprentice = "CP",
|
|
/obj/structure/closet/wizard/souls = "SS",
|
|
/obj/item/weapon/contract/wizard/tk = "TK",
|
|
/obj/structure/closet/wizard/scrying = "SO",
|
|
/obj/item/weapon/teleportation_scroll = "TS",
|
|
/obj/item/weapon/gun/energy/staff = "ST",
|
|
/obj/item/weapon/gun/energy/staff/animate = "SA",
|
|
/obj/item/weapon/melee/energy/wizard = "WS",
|
|
/obj/item/weapon/gun/energy/staff/chaos = "SC",
|
|
/obj/item/weapon/storage/belt/wands/full = "WB")
|
|
|
|
/obj/item/weapon/spellbook
|
|
name = "master spell book"
|
|
desc = "The legendary book of spells of the wizard."
|
|
icon = 'icons/obj/wizard.dmi'
|
|
icon_state = "spellbook"
|
|
throw_speed = 1
|
|
throw_range = 5
|
|
w_class = 2
|
|
var/uses = 1
|
|
var/temp = null
|
|
var/datum/spellbook/spellbook
|
|
var/spellbook_type = /datum/spellbook/ //for spawning specific spellbooks.
|
|
|
|
/obj/item/weapon/spellbook/New()
|
|
..()
|
|
set_spellbook(spellbook_type)
|
|
|
|
/obj/item/weapon/spellbook/proc/set_spellbook(var/type)
|
|
if(spellbook)
|
|
qdel(spellbook)
|
|
spellbook = new type()
|
|
uses = spellbook.max_uses
|
|
name = spellbook.name
|
|
desc = spellbook.desc
|
|
|
|
/obj/item/weapon/spellbook/attack_self(mob/user as mob)
|
|
if(!user)
|
|
return
|
|
if(!(user.faction == "Space Wizard"))
|
|
if(istype(user, /mob/living/carbon/human))
|
|
//Save the users active hand
|
|
var/mob/living/carbon/human/H = user
|
|
var/obj/item/organ/external/LA = H.get_organ("l_arm")
|
|
var/obj/item/organ/external/RA = H.get_organ("r_arm")
|
|
var/active_hand = H.hand
|
|
to_chat(user, "<span class='warning'>You feel unimaginable agony as your eyes pour over millenia of forbidden knowledge!</span>")
|
|
user.show_message("<b>[user]</b> screams in horror!",2)
|
|
H.ChangeToHusk()
|
|
H.adjust_fire_stacks(0, H.fire_stacks)
|
|
H.IgniteMob(2)
|
|
H.updatehealth()
|
|
user.drop_item()
|
|
playsound(user, 'sound/hallucinations/i_see_you2.ogg', 100, 1)
|
|
if(active_hand)
|
|
LA.droplimb(0,DROPLIMB_BURN)
|
|
else
|
|
RA.droplimb(0,DROPLIMB_BURN)
|
|
return
|
|
else
|
|
interact(user)
|
|
|
|
/obj/item/weapon/spellbook/interact(mob/user as mob)
|
|
var/dat = null
|
|
if(temp)
|
|
dat = "[temp]<br><a href='byond://?src=\ref[src];temp=1'>Return</a>"
|
|
else
|
|
dat = "<center><h3>[spellbook.title]</h3><i>[spellbook.title_desc]</i><br>You have [uses] spell slot[uses > 1 ? "s" : ""] left.</center><br>"
|
|
dat += "<center><font color='#ff33cc'>Requires Wizard Garb</font><br><font color='#ff6600'>Selectable Target</font><br><font color='#33cc33'>Spell Charge Type: Recharge, Sacrifice, Charges</font></center><br>"
|
|
for(var/i in 1 to spellbook.spells.len)
|
|
var/name = "" //name of target
|
|
var/desc = "" //description of target
|
|
var/info = "" //additional information
|
|
if(ispath(spellbook.spells[i],/datum/spellbook))
|
|
var/datum/spellbook/S = spellbook.spells[i]
|
|
name = initial(S.name)
|
|
desc = initial(S.book_desc)
|
|
info = "<font color='#ff33cc'>[initial(S.max_uses)] Spell Slots</font>"
|
|
else if(ispath(spellbook.spells[i],/obj))
|
|
var/obj/O = spellbook.spells[i]
|
|
name = "Artefact: [capitalize(initial(O.name))]" //because 99.99% of objects dont have capitals in them and it makes it look weird.
|
|
desc = initial(O.desc)
|
|
else if(ispath(spellbook.spells[i],/spell))
|
|
var/spell/S = spellbook.spells[i]
|
|
name = initial(S.name)
|
|
desc = initial(S.desc)
|
|
var/testing = initial(S.spell_flags)
|
|
if(testing & NEEDSCLOTHES)
|
|
info = "<font color='#ff33cc'>W</font>"
|
|
var/type = ""
|
|
switch(initial(S.charge_type))
|
|
if(Sp_RECHARGE)
|
|
type = "R"
|
|
if(Sp_HOLDVAR)
|
|
type = "S"
|
|
if(Sp_CHARGES)
|
|
type = "C"
|
|
info += "<font color='#33cc33'>[type]</font>"
|
|
dat += "<A href='byond://?src=\ref[src];path=[spellbook.spells[i]]'>[name]</a>"
|
|
if(length(info))
|
|
dat += " ([info])"
|
|
dat += " ([spellbook.spells[spellbook.spells[i]]] spell slot[spellbook.spells[spellbook.spells[i]] > 1 ? "s" : "" ])"
|
|
if(spellbook.book_flags & CAN_MAKE_CONTRACTS)
|
|
dat += " <A href='byond://?src=\ref[src];path=[spellbook.spells[i]];contract=1;'>Make Contract</a>"
|
|
dat += "<br><i>[desc]</i><br>"
|
|
dat += "<center><A href='byond://?src=\ref[src];reset=1'>Re-memorize your spellbook.</a></center>"
|
|
dat += "<center><A href='byond://?src=\ref[src];lock=1'>[spellbook.book_flags & LOCKED ? "Unlock" : "Lock"] the spellbook.</a></center>"
|
|
user << browse(dat,"window=spellbook")
|
|
|
|
/obj/item/weapon/spellbook/Topic(href,href_list)
|
|
..()
|
|
|
|
var/mob/living/carbon/human/H = usr
|
|
|
|
if(H.stat || H.restrained())
|
|
return
|
|
|
|
if(!istype(H))
|
|
return
|
|
|
|
if(H.mind && spellbook.book_flags & LOCKED && H.mind.special_role == "apprentice") //make sure no scrubs get behind the lock
|
|
return
|
|
|
|
if(!H.contents.Find(src))
|
|
H << browse(null,"window=spellbook")
|
|
return
|
|
|
|
if(href_list["lock"])
|
|
if(spellbook.book_flags & LOCKED)
|
|
spellbook.book_flags &= ~LOCKED
|
|
else
|
|
spellbook.book_flags |= LOCKED
|
|
|
|
if(href_list["temp"])
|
|
temp = null
|
|
|
|
if(href_list["path"])
|
|
var/path = text2path(href_list["path"])
|
|
if(uses < spellbook.spells[path])
|
|
to_chat(usr, "<span class='notice'>You do not have enough spell slots to purchase this.</span>")
|
|
return
|
|
uses -= spellbook.spells[path]
|
|
send_feedback(path) //feedback stuff
|
|
if(ispath(path,/datum/spellbook))
|
|
src.set_spellbook(path)
|
|
temp = "You have chosen a new spellbook."
|
|
else
|
|
if(href_list["contract"])
|
|
if(!(spellbook.book_flags & CAN_MAKE_CONTRACTS))
|
|
return //no
|
|
spellbook.max_uses -= spellbook.spells[path] //no basksies
|
|
var/obj/O = new /obj/item/weapon/contract/boon(get_turf(usr),path)
|
|
temp = "You have purchased \the [O]."
|
|
else
|
|
if(ispath(path,/spell))
|
|
temp = src.add_spell(usr,path)
|
|
else
|
|
var/obj/O = new path(get_turf(usr))
|
|
temp = "You have purchased \a [O]."
|
|
spellbook.max_uses -= spellbook.spells[path]
|
|
//finally give it a bit of an oomf
|
|
playsound(get_turf(usr),'sound/effects/phasein.ogg',50,1)
|
|
if(href_list["reset"])
|
|
var/area/wizard_station/A = locate()
|
|
if(usr in A.contents)
|
|
uses = spellbook.max_uses
|
|
H.spellremove()
|
|
temp = "All spells have been removed. You may now memorize a new set of spells."
|
|
feedback_add_details("wizard_spell_learned","UM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
|
else
|
|
to_chat(usr, "<span class='warning'>You must be in the wizard academy to re-memorize your spells.</span>")
|
|
|
|
src.interact(usr)
|
|
|
|
|
|
/obj/item/weapon/spellbook/proc/send_feedback(var/path)
|
|
if(ispath(path,/datum/spellbook))
|
|
var/datum/spellbook/S = path
|
|
feedback_add_details("wizard_spell_learned","[initial(S.feedback)]")
|
|
else if(ispath(path,/spell))
|
|
var/spell/S = path
|
|
feedback_add_details("wizard_spell_learned","[initial(S.feedback)]")
|
|
else if(ispath(path,/obj))
|
|
feedback_add_details("wizard_spell_learned","[artefact_feedback[path]]")
|
|
|
|
|
|
/obj/item/weapon/spellbook/proc/add_spell(var/mob/user, var/spell_path)
|
|
for(var/spell/S in user.spell_list)
|
|
if(istype(S,spell_path))
|
|
if(!S.can_improve())
|
|
uses += spellbook.spells[spell_path]
|
|
return "You cannot improve the spell [S] further."
|
|
if(S.can_improve(Sp_SPEED) && S.can_improve(Sp_POWER))
|
|
switch(alert(user, "Do you want to upgrade this spell's speed or power?", "Spell upgrade", "Speed", "Power", "Cancel"))
|
|
if("Speed")
|
|
return S.quicken_spell()
|
|
if("Power")
|
|
return S.empower_spell()
|
|
else
|
|
uses += spellbook.spells[spell_path]
|
|
return
|
|
else if(S.can_improve(Sp_POWER))
|
|
return S.empower_spell()
|
|
else if(S.can_improve(Sp_SPEED))
|
|
return S.quicken_spell()
|
|
|
|
var/spell/S = new spell_path()
|
|
user.add_spell(S)
|
|
return "You learn the spell [S]"
|
|
|
|
/datum/spellbook
|
|
var/name = "\improper book of tomes"
|
|
var/desc = "The legendary book of spells of the wizard."
|
|
var/book_desc = "Holds information on the various tomes available to a wizard"
|
|
var/feedback = "" //doesn't need one.
|
|
var/book_flags = 0
|
|
var/max_uses = 1
|
|
var/title = "Book of Tomes"
|
|
var/title_desc = "This tome marks down all the available tomes for use. Choose wisely, there are no refunds."
|
|
var/list/spells = list(/datum/spellbook/standard = 1,
|
|
/datum/spellbook/cleric = 1,
|
|
/datum/spellbook/battlemage = 1,
|
|
/datum/spellbook/spatial = 1,
|
|
/datum/spellbook/druid = 1,
|
|
/datum/spellbook/necromancer = 1
|
|
) //spell's path = cost of spell |