mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-22 20:43:10 +01:00
Bay wizard port/rework (#1635)
Ports the newest bay wizard version, with some additions and changes. General changes: -ported the newest bay wizard -wizards can select some school of magic, which also changes their spell selection as whole. -added several new spells, like raise dead, contracts that bind the person with the wizard, and more. -added wands, limited sources of certain types of effects/spell, also with their own bad effects for non wizards -changed the wizard checks to a faction check instead of a mind check -fixed wizards without certain slots due to race being fucked over due to it -added new artifacts -balanced some spells like the emp -added a lot of new sounds to spell, mostly from tg -remove horse mask from spell selection, also, you can melt the mask with acid now -wizard's spell are now displayed at round end like traitors and what they did buy -also fixes vaurca, and vox, antags spawning without a mask by default
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
/datum/species/skeleton //SPOOKY
|
||||
name = "Skeleton"
|
||||
name_plural = "skeletons"
|
||||
|
||||
bodytype = "Skeleton"
|
||||
icobase = 'icons/mob/human_races/r_skeleton.dmi'
|
||||
deform = 'icons/mob/human_races/r_skeleton.dmi'
|
||||
|
||||
|
||||
@@ -0,0 +1,182 @@
|
||||
/mob/living/simple_animal/familiar
|
||||
name = "familiar"
|
||||
desc = "No wizard is complete without a mystical sidekick."
|
||||
supernatural = 1
|
||||
|
||||
response_help = "pets"
|
||||
response_disarm = "pushes"
|
||||
response_harm = "hits"
|
||||
|
||||
universal_speak = 1
|
||||
universal_understand = 1
|
||||
|
||||
min_oxy = 1 //still require a /bit/ of air.
|
||||
max_co2 = 0
|
||||
unsuitable_atoms_damage = 1
|
||||
|
||||
var/list/wizardy_spells = list()
|
||||
|
||||
/mob/living/simple_animal/familiar/New()
|
||||
..()
|
||||
add_language("Ceti Basic")
|
||||
for(var/spell in wizardy_spells)
|
||||
src.add_spell(new spell, "const_spell_ready")
|
||||
|
||||
/mob/living/simple_animal/familiar/carcinus
|
||||
name = "crab"
|
||||
desc = "An odd looking crab."
|
||||
icon = 'icons/mob/animal.dmi'
|
||||
icon_state = "evilcrab"
|
||||
icon_living = "evilcrab"
|
||||
icon_dead = "evilcrab_dead"
|
||||
|
||||
speak_emote = list("chitters","clicks")
|
||||
|
||||
|
||||
health = 200
|
||||
maxHealth = 200
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 15
|
||||
attacktext = "pinches"
|
||||
resistance = 9
|
||||
|
||||
|
||||
/mob/living/simple_animal/familiar/pike
|
||||
name = "space pike"
|
||||
desc = "A bigger, more magical cousin of the space carp."
|
||||
|
||||
icon = 'icons/mob/spaceshark.dmi'
|
||||
icon_state = "shark"
|
||||
icon_living = "shark"
|
||||
icon_dead = "shark_dead"
|
||||
pixel_x = -16
|
||||
|
||||
speak_emote = list("gnashes")
|
||||
|
||||
health = 100
|
||||
maxHealth = 100
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 10
|
||||
|
||||
min_oxy = 0
|
||||
|
||||
wizardy_spells = list(/spell/aoe_turf/conjure/forcewall)
|
||||
|
||||
/mob/living/simple_animal/familiar/pike/Process_Spacemove(var/check_drift = 0)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/familiar/horror
|
||||
name = "horror"
|
||||
desc = "A sanity-destroying otherthing."
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "horror"
|
||||
icon_living = "horror"
|
||||
|
||||
speak_emote = list("moans", "groans")
|
||||
|
||||
response_help = "thinks better of touching"
|
||||
|
||||
health = 150
|
||||
maxHealth = 150
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 8
|
||||
attacktext = "touches"
|
||||
|
||||
wizardy_spells = list(/spell/targeted/torment)
|
||||
|
||||
/mob/living/simple_animal/familiar/horror/death()
|
||||
..(null,"rapidly deteriorates")
|
||||
|
||||
ghostize()
|
||||
gibs(src.loc)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/mob/living/simple_animal/familiar/goat
|
||||
name = "goat"
|
||||
desc = "An elder looking goat."
|
||||
icon_state = "goat"
|
||||
icon_living = "goat"
|
||||
icon_dead = "goat_dead"
|
||||
speak_emote = list("brays")
|
||||
|
||||
mob_size = MOB_SMALL
|
||||
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
|
||||
wizardy_spells = list(/spell/targeted/heal_target,
|
||||
/spell/targeted/heal_target/area)
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/familiar/pet //basically variants of normal animals with spells.
|
||||
icon = 'icons/mob/animal.dmi'
|
||||
var/icon_rest //so that we can have resting little guys.
|
||||
|
||||
/mob/living/simple_animal/familiar/pet/MouseDrop(atom/over_object)
|
||||
var/mob/living/carbon/H = over_object
|
||||
if(!istype(H) || !Adjacent(H)) return ..()
|
||||
|
||||
if(H.a_intent == "help" && holder_type)
|
||||
get_scooped(H)
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/familiar/pet/Life()
|
||||
..()
|
||||
if(!icon_rest)
|
||||
return
|
||||
if(stat == UNCONSCIOUS || resting)
|
||||
icon_state = icon_rest
|
||||
|
||||
/mob/living/simple_animal/familiar/pet/mouse
|
||||
name = "mouse"
|
||||
desc = "A small rodent. It looks very old."
|
||||
icon_state = "mouse_gray"
|
||||
icon_living = "mouse_gray"
|
||||
icon_dead = "mouse_gray_dead"
|
||||
icon_rest = "mouse_gray_sleep"
|
||||
|
||||
speak_emote = list("squeeks")
|
||||
holder_type = /obj/item/weapon/holder/mouse
|
||||
pass_flags = PASSTABLE
|
||||
mob_size = MOB_MINISCULE
|
||||
|
||||
response_harm = "stamps on"
|
||||
|
||||
health = 15
|
||||
maxHealth = 15
|
||||
melee_damage_lower = 1
|
||||
melee_damage_upper = 1
|
||||
attacktext = "nibbles"
|
||||
|
||||
wizardy_spells = list(/spell/aoe_turf/smoke)
|
||||
|
||||
/mob/living/simple_animal/familiar/pet/mouse/New()
|
||||
..()
|
||||
|
||||
verbs += /mob/living/proc/ventcrawl
|
||||
verbs += /mob/living/proc/hide
|
||||
|
||||
/mob/living/simple_animal/familiar/pet/cat
|
||||
name = "black cat"
|
||||
desc = "A pitch black cat. Said to be especially unlucky."
|
||||
icon_state = "cat3"
|
||||
icon_living = "cat3"
|
||||
icon_dead = "cat3_dead"
|
||||
icon_rest = "cat3_rest"
|
||||
|
||||
|
||||
speak_emote = list("meows", "purrs")
|
||||
holder_type = /obj/item/weapon/holder/cat
|
||||
mob_size = MOB_SMALL
|
||||
|
||||
health = 25
|
||||
maxHealth = 25
|
||||
melee_damage_lower = 3
|
||||
melee_damage_upper = 4
|
||||
attacktext = "claws"
|
||||
|
||||
wizardy_spells = list(/spell/targeted/subjugation)
|
||||
@@ -0,0 +1,3 @@
|
||||
#define COMMANDED_STOP 6 //basically 'do nothing'
|
||||
#define COMMANDED_FOLLOW 7 //follows a target
|
||||
#define COMMANDED_MISC 8 //catch all state for misc commands that need one.
|
||||
@@ -0,0 +1,69 @@
|
||||
/mob/living/simple_animal/hostile/commanded/bear
|
||||
name = "bear"
|
||||
desc = "A large brown bear."
|
||||
|
||||
icon_state = "brownbear"
|
||||
icon_living = "brownbear"
|
||||
icon_dead = "brownbear_dead"
|
||||
icon_gib = "brownbear_gib"
|
||||
|
||||
health = 75
|
||||
maxHealth = 75
|
||||
|
||||
density = 1
|
||||
|
||||
attacktext = "swatted"
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 10
|
||||
|
||||
min_oxy = 5
|
||||
max_co2 = 5
|
||||
max_tox = 2 //We tuff bear
|
||||
|
||||
response_help = "pets"
|
||||
response_harm = "hits"
|
||||
response_disarm = "pushes"
|
||||
|
||||
known_commands = list("stay", "stop", "attack", "follow", "dance", "boogie", "boogy")
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/bear/hit_with_weapon(obj/item/O, mob/living/user, var/effective_force, var/hit_zone)
|
||||
. = ..()
|
||||
if(!.)
|
||||
src.emote("roars in rage!")
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/bear/attack_hand(mob/living/carbon/human/M as mob)
|
||||
..()
|
||||
if(M.a_intent == I_HURT)
|
||||
src.emote("roars in rage!")
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/bear/listen()
|
||||
if(stance != COMMANDED_MISC) //cant listen if its booty shakin'
|
||||
..()
|
||||
|
||||
//WE DANCE!
|
||||
/mob/living/simple_animal/hostile/commanded/bear/misc_command(var/mob/speaker,var/text)
|
||||
stay_command()
|
||||
stance = COMMANDED_MISC //nothing can stop this ride
|
||||
spawn(0)
|
||||
src.visible_message("\The [src] starts to dance!.")
|
||||
var/datum/gender/G = gender_datums[gender]
|
||||
for(var/i in 1 to 10)
|
||||
if(stance != COMMANDED_MISC || incapacitated()) //something has stopped this ride.
|
||||
return
|
||||
var/message = pick(\
|
||||
"moves [G.his] head back and forth!",\
|
||||
"bobs [G.his] booty!",\
|
||||
"shakes [G.his] paws in the air!",\
|
||||
"wiggles [G.his] ears!",\
|
||||
"taps [G.his] foot!",\
|
||||
"shrugs [G.his] shoulders!",\
|
||||
"dances like you've never seen!")
|
||||
if(dir != WEST)
|
||||
set_dir(WEST)
|
||||
else
|
||||
set_dir(EAST)
|
||||
src.visible_message("\The [src] [message]")
|
||||
sleep(30)
|
||||
stance = COMMANDED_STOP
|
||||
set_dir(SOUTH)
|
||||
src.visible_message("\The [src] bows, finished with [G.his] dance.")
|
||||
@@ -0,0 +1,192 @@
|
||||
/mob/living/simple_animal/hostile/commanded
|
||||
name = "commanded"
|
||||
stance = COMMANDED_STOP
|
||||
melee_damage_lower = 0
|
||||
melee_damage_upper = 0
|
||||
density = 0
|
||||
var/list/command_buffer = list()
|
||||
var/list/known_commands = list("stay", "stop", "attack", "follow")
|
||||
var/mob/master = null //undisputed master. Their commands hold ultimate sway and ultimate power.
|
||||
var/list/allowed_targets = list() //WHO CAN I KILL D:
|
||||
var/retribution = 1 //whether or not they will attack us if we attack them like some kinda dick.
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
|
||||
if((speaker in friends) || speaker == master)
|
||||
command_buffer.Add(speaker)
|
||||
command_buffer.Add(lowertext(html_decode(message)))
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0)
|
||||
if((speaker in friends) || speaker == master)
|
||||
command_buffer.Add(speaker)
|
||||
command_buffer.Add(lowertext(html_decode(message)))
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/Life()
|
||||
while(command_buffer.len > 0)
|
||||
var/mob/speaker = command_buffer[1]
|
||||
var/text = command_buffer[2]
|
||||
var/filtered_name = lowertext(html_decode(name))
|
||||
if(dd_hasprefix(text,filtered_name) || dd_hasprefix(text,"everyone") || dd_hasprefix(text, "everybody")) //in case somebody wants to command 8 bears at once.
|
||||
var/substring = copytext(text,length(filtered_name)+1) //get rid of the name.
|
||||
listen(speaker,substring)
|
||||
command_buffer.Remove(command_buffer[1],command_buffer[2])
|
||||
. = ..()
|
||||
if(.)
|
||||
switch(stance)
|
||||
if(COMMANDED_FOLLOW)
|
||||
follow_target()
|
||||
if(COMMANDED_STOP)
|
||||
commanded_stop()
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/FindTarget(var/new_stance = HOSTILE_STANCE_ATTACK)
|
||||
if(!allowed_targets.len)
|
||||
return null
|
||||
var/mode = "specific"
|
||||
if(allowed_targets[1] == "everyone") //we have been given the golden gift of murdering everything. Except our master, of course. And our friends. So just mostly everyone.
|
||||
mode = "everyone"
|
||||
for(var/atom/A in ListTargets(10))
|
||||
var/mob/M = null
|
||||
if(A == src)
|
||||
continue
|
||||
if(isliving(A))
|
||||
M = A
|
||||
if(istype(A,/obj/mecha))
|
||||
var/obj/mecha/mecha = A
|
||||
if(!mecha.occupant)
|
||||
continue
|
||||
M = mecha.occupant
|
||||
if(M && M.stat)
|
||||
continue
|
||||
if(mode == "specific")
|
||||
if(!(A in allowed_targets))
|
||||
continue
|
||||
stance = new_stance
|
||||
return A
|
||||
else
|
||||
if(M == master || (M in friends))
|
||||
continue
|
||||
stance = new_stance
|
||||
return A
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/proc/follow_target()
|
||||
stop_automated_movement = 1
|
||||
if(!target_mob)
|
||||
return
|
||||
if(target_mob in ListTargets(10))
|
||||
walk_to(src,target_mob,1,move_to_delay)
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/proc/commanded_stop() //basically a proc that runs whenever we are asked to stay put. Probably going to remain unused.
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/proc/listen(var/mob/speaker, var/text)
|
||||
for(var/command in known_commands)
|
||||
if(findtext(text,command))
|
||||
switch(command)
|
||||
if("stay")
|
||||
if(stay_command(speaker,text)) //find a valid command? Stop. Dont try and find more.
|
||||
break
|
||||
if("stop")
|
||||
if(stop_command(speaker,text))
|
||||
break
|
||||
if("attack")
|
||||
if(attack_command(speaker,text))
|
||||
break
|
||||
if("follow")
|
||||
if(follow_command(speaker,text))
|
||||
break
|
||||
else
|
||||
misc_command(speaker,text) //for specific commands
|
||||
|
||||
return 1
|
||||
|
||||
//returns a list of everybody we wanna do stuff with.
|
||||
/mob/living/simple_animal/hostile/commanded/proc/get_targets_by_name(var/text, var/filter_friendlies = 0)
|
||||
var/list/possible_targets = hearers(src,10)
|
||||
. = list()
|
||||
for(var/mob/M in possible_targets)
|
||||
if(filter_friendlies && ((M in friends) || M.faction == faction || M == master))
|
||||
continue
|
||||
var/found = 0
|
||||
if(findtext(text, "[M]"))
|
||||
found = 1
|
||||
else
|
||||
var/list/parsed_name = splittext(replace_characters(lowertext(html_decode("[M]")),list("-"=" ", "."=" ", "," = " ", "'" = " ")), " ") //this big MESS is basically 'turn this into words, no punctuation, lowercase so we can check first name/last name/etc'
|
||||
for(var/a in parsed_name)
|
||||
if(a == "the" || length(a) < 2) //get rid of shit words.
|
||||
continue
|
||||
if(findtext(text,"[a]"))
|
||||
found = 1
|
||||
break
|
||||
if(found)
|
||||
. += M
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/proc/attack_command(var/mob/speaker,var/text)
|
||||
target_mob = null //want me to attack something? Well I better forget my old target.
|
||||
walk_to(src,0)
|
||||
stance = HOSTILE_STANCE_IDLE
|
||||
if(text == "attack" || findtext(text,"everyone") || findtext(text,"anybody") || findtext(text, "somebody") || findtext(text, "someone")) //if its just 'attack' then just attack anybody, same for if they say 'everyone', somebody, anybody. Assuming non-pickiness.
|
||||
allowed_targets = list("everyone")//everyone? EVERYONE
|
||||
return 1
|
||||
|
||||
var/list/targets = get_targets_by_name(text)
|
||||
allowed_targets += targets
|
||||
return targets.len != 0
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/proc/stay_command(var/mob/speaker,var/text)
|
||||
target_mob = null
|
||||
stance = COMMANDED_STOP
|
||||
stop_automated_movement = 1
|
||||
walk_to(src,0)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/proc/stop_command(var/mob/speaker,var/text)
|
||||
allowed_targets = list()
|
||||
walk_to(src,0)
|
||||
target_mob = null //gotta stop SOMETHIN
|
||||
stance = HOSTILE_STANCE_IDLE
|
||||
stop_automated_movement = 0
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/proc/follow_command(var/mob/speaker,var/text)
|
||||
//we can assume 'stop following' is handled by stop_command
|
||||
if(findtext(text,"me"))
|
||||
stance = COMMANDED_FOLLOW
|
||||
target_mob = speaker //this wont bite me in the ass later.
|
||||
return 1
|
||||
var/list/targets = get_targets_by_name(text)
|
||||
if(targets.len > 1 || !targets.len) //CONFUSED. WHO DO I FOLLOW?
|
||||
return 0
|
||||
|
||||
stance = COMMANDED_FOLLOW //GOT SOMEBODY. BETTER FOLLOW EM.
|
||||
target_mob = targets[1] //YEAH GOOD IDEA
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/proc/misc_command(var/mob/speaker,var/text)
|
||||
return 0
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/hit_with_weapon(obj/item/O, mob/living/user, var/effective_force, var/hit_zone)
|
||||
//if they attack us, we want to kill them. None of that "you weren't given a command so free kill" bullshit.
|
||||
. = ..()
|
||||
if(!. && retribution)
|
||||
stance = HOSTILE_STANCE_ATTACK
|
||||
target_mob = user
|
||||
allowed_targets += user //fuck this guy in particular.
|
||||
if(user in friends) //We were buds :'(
|
||||
friends -= user
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/attack_hand(mob/living/carbon/human/M as mob)
|
||||
..()
|
||||
if(M.a_intent == I_HURT && retribution) //assume he wants to hurt us.
|
||||
target_mob = M
|
||||
allowed_targets += M
|
||||
stance = HOSTILE_STANCE_ATTACK
|
||||
if(M in friends)
|
||||
friends -= M
|
||||
@@ -105,6 +105,26 @@
|
||||
return DIONA_NYMPH
|
||||
return 0
|
||||
|
||||
/proc/isskeleton(A)
|
||||
if(istype(A, /mob/living/carbon/human) && (A:get_species() == "Skeleton"))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/islesserform(A)
|
||||
if(istype(A, /mob/living/carbon/human))
|
||||
switch(A:get_species())
|
||||
if ("Monkey")
|
||||
return 1
|
||||
if ("Farwa")
|
||||
return 1
|
||||
if ("Neaera")
|
||||
return 1
|
||||
if ("Stok")
|
||||
return 1
|
||||
if ("V'krexi")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
proc/isdeaf(A)
|
||||
if(istype(A, /mob))
|
||||
var/mob/M = A
|
||||
|
||||
Reference in New Issue
Block a user