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:
Alberyk
2017-02-07 18:45:42 +02:00
committed by skull132
parent 723f5c3fb2
commit ed6dbee896
111 changed files with 3213 additions and 658 deletions
@@ -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
+20
View File
@@ -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