Skip to content

Commit

Permalink
Implemented grafadreka.
Browse files Browse the repository at this point in the history
  • Loading branch information
MistakeNot4892 committed May 1, 2024
1 parent dcc8e86 commit 9e97eb6
Show file tree
Hide file tree
Showing 36 changed files with 807 additions and 0 deletions.
1 change: 1 addition & 0 deletions maps/modpack_testing/modpack_testing.dm
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "../../mods/mobs/borers/_borers.dme"

#include "../../mods/species/ascent/_ascent.dme"
#include "../../mods/species/drakes/_drakes.dme"
#include "../../mods/species/neoavians/_neoavians.dme"
#include "../../mods/species/utility_frames/_utility_frames.dme"
#include "../../mods/species/bayliens/_bayliens.dme"
Expand Down
1 change: 1 addition & 0 deletions maps/tradeship/tradeship.dm
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "../../mods/mobs/borers/_borers.dme"

#include "../../mods/species/ascent/_ascent.dme"
#include "../../mods/species/drakes/_drakes.dme"
#include "../../mods/species/serpentid/_serpentid.dme"
#include "../../mods/species/utility_frames/_utility_frames.dme"
#include "../../mods/species/neoavians/_neoavians.dme"
Expand Down
17 changes: 17 additions & 0 deletions mods/species/drakes/_drakes.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#define SPECIES_GRAFADREKA "Grafadreka"
#define BODYTYPE_GRAFADREKA "drake body"
#define BP_DRAKE_GIZZARD "drake gizzard"

/decl/modpack/grafadreka
name = "Drake Species"

/obj/item/backpack/setup_sprite_sheets()
. = ..()
LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA, 'mods/species/drakes/icons/clothing/backpack.dmi')

/obj/item/card/id/setup_sprite_sheets()
. = ..()
LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA, 'mods/species/drakes/icons/clothing/id.dmi')

/mob/living/carbon/human/grafadreka/Initialize(mapload)
. = ..(mapload, SPECIES_GRAFADREKA)
17 changes: 17 additions & 0 deletions mods/species/drakes/_drakes.dme
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#ifndef MODPACK_DRAKES
#define MODPACK_DRAKES
// BEGIN_INCLUDE
#include "_drakes.dm"
#include "culture.dm"
#include "drake_abilities_friendly.dm"
#include "drake_abilities_hostile.dm"
#include "drake_abilities.dm"
#include "drake_attacks.dm"
#include "drake_emotes.dm"
#include "drake_organs.dm"
#include "drake_spit.dm"
#include "language.dm"
#include "species.dm"
#include "species_bodytypes.dm"
// END_INCLUDE
#endif
26 changes: 26 additions & 0 deletions mods/species/drakes/culture.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/decl/cultural_info/culture/grafadreka
name = "Grafadreka Culture"
description = "You are a drake. Hiss hiss."
language = /decl/language/grafadreka
hidden = TRUE
hidden_from_codex = TRUE

/decl/cultural_info/location/grafadreka
name = "Sif"
description = "You are from the frozen garden world of Sif."
language = /decl/language/grafadreka
hidden = TRUE
hidden_from_codex = TRUE

/decl/cultural_info/faction/grafadreka
name = "Grafadreka Pack"
description = "You are from a drake pack. Hiss hiss."
language = /decl/language/grafadreka
hidden = TRUE
hidden_from_codex = TRUE

/decl/cultural_info/religion/grafadreka
name = "Grafadreka Religion"
description = "Meatballs..."
hidden = TRUE
hidden_from_codex = TRUE
37 changes: 37 additions & 0 deletions mods/species/drakes/drake_abilities.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/datum/ability_handler/grafadreka
var/spit_projectile_type = /obj/item/projectile/drake_spit
var/next_spit = 0

/datum/ability_handler/grafadreka/hatchling
spit_projectile_type = /obj/item/projectile/drake_spit/weak

/datum/ability_handler/grafadreka/do_ranged_invocation(mob/user, atom/target)
if(!istype(user) || user.a_intent != I_HURT || user.incapacitated() || !isatom(target))
return FALSE
if(world.time < next_spit)
return FALSE
next_spit = world.time + 3 SECONDS
user.visible_message(SPAN_DANGER("\The [user] spits at \the [target]!"))
var/obj/item/projectile/spit = new spit_projectile_type(get_turf(user))
if(spit)
playsound(user, spit.fire_sound, 100, 1)
spit.launch(target, user.get_target_zone(), user)
return TRUE

/datum/ability_handler/grafadreka/do_melee_invocation(mob/user, atom/target)

if(!istype(user) || user.incapacitated() || !isatom(target) || !target.Adjacent(user))
return FALSE

// Nibbles
if(user.a_intent == I_HURT)
if(isliving(target))
return handle_dismemberment(user, target)
if(istype(target, /obj/item/organ))
return handle_organ_destruction(user, target)

// Healing
if(user.a_intent == I_HELP && isliving(target))
return handle_wound_cleaning(user, target)

return FALSE
104 changes: 104 additions & 0 deletions mods/species/drakes/drake_abilities_friendly.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
/datum/ability_handler/grafadreka/proc/handle_wound_cleaning(mob/user, mob/living/friend)
return FALSE

/*
/mob/living/simple_mob/animal/sif/grafadreka/do_help_interaction(atom/A)
if(isliving(A))
var/mob/living/friend = A
if (friend.stat == DEAD)
if(friend == src)
to_chat(src, SPAN_WARNING("\The [friend] is dead; tending their wounds is pointless."))
else
return ..()
return TRUE
if (!can_tend_wounds(friend))
if (friend == src)
if (health == maxHealth)
to_chat(src, SPAN_WARNING("You are unwounded."))
else
to_chat(src, SPAN_WARNING("You cannot tend any of your wounds."))
else
if (friend.health == friend.maxHealth)
return ..()
to_chat(src, SPAN_WARNING("You cannot tend any of \the [friend]'s wounds."))
return TRUE
if (friend.has_modifier_of_type(/datum/modifier/sifsap_salve))
if (friend == src)
to_chat(src, SPAN_WARNING("You have already cleaned your wounds."))
else
return ..()
return TRUE
if (!has_sap(10))
if (friend == src)
to_chat(src, SPAN_WARNING("You don't have enough sap to clean your wounds."))
else
return ..()
return TRUE
if (friend == src)
visible_message(SPAN_NOTICE("\The [src] begins to drool a blue-glowing liquid, which they start slathering over their wounds."))
else
visible_message(SPAN_NOTICE("\The [src] begins to drool a blue-glowing liquid, which they start slathering over \the [friend]'s wounds."))
playsound(src, 'sound/effects/ointment.ogg', 25)
var/friend_ref = "\ref[friend]"
global.wounds_being_tended_by_drakes[friend_ref] = world.time + (8 SECONDS)
set_AI_busy(TRUE)
if (!do_after(src, 8 SECONDS, friend) || QDELETED(friend) || friend.has_modifier_of_type(/datum/modifier/sifsap_salve) || incapacitated() || !spend_sap(10))
global.wounds_being_tended_by_drakes -= friend_ref
set_AI_busy(FALSE)
return TRUE
global.wounds_being_tended_by_drakes -= friend_ref
set_AI_busy(FALSE)
if (friend == src)
visible_message(SPAN_NOTICE("\The [src] finishes licking at their wounds."))
else
visible_message(SPAN_NOTICE("\The [src] finishes licking at \the [friend]'s wounds."))
playsound(src, 'sound/effects/ointment.ogg', 25)
// Sivian animals get a heal buff from the modifier, others just
// get it to stop friendly drakes constantly licking their wounds.
friend.add_modifier(/datum/modifier/sifsap_salve, 60 SECONDS)
// Human wounds are closed, but they get sifsap via open wounds.
if (ishuman(friend))
var/mob/living/carbon/human/H = friend
for (var/obj/item/organ/external/E in H.organs)
if (E.status & ORGAN_BLEEDING)
E.organ_clamp()
H.bloodstr.add_reagent("sifsap", rand(1,2))
for (var/datum/wound/W in E.wounds)
W.salve()
W.disinfect()
// Everyone else is just poisoned.
else if (!istype(friend, /mob/living/simple_mob/animal/sif))
friend.adjustToxLoss(rand(10,20))
return TRUE
return ..()
/datum/modifier/sifsap_salve
name = "Sifsap Salve"
desc = "Your wounds have been salved with Sivian sap."
mob_overlay_state = "cyan_sparkles"
stacks = MODIFIER_STACK_FORBID
on_created_text = "<span class = 'notice'>The glowing sap seethes and bubbles in your wounds, tingling and stinging.</span>"
on_expired_text = "<span class = 'notice'>The last of the sap in your wounds fizzles away.</span>"
/datum/modifier/sifsap_salve/tick()
if (holder.stat == DEAD || holder.isSynthetic())
expire()
if (istype(holder, /mob/living/simple_mob/animal/sif))
var/mob/living/simple_mob/animal/sif/critter = holder
if (critter.health >= (critter.getMaxHealth() * critter.sap_heal_threshold))
return
if (holder.resting)
if (istype(holder.loc, /obj/structure/animal_den))
holder.adjustBruteLoss(-3)
holder.adjustFireLoss(-3)
holder.adjustToxLoss(-2)
else
holder.adjustBruteLoss(-2)
holder.adjustFireLoss(-2)
holder.adjustToxLoss(-1)
else
holder.adjustBruteLoss(-1)
holder.adjustFireLoss(-1)
*/
41 changes: 41 additions & 0 deletions mods/species/drakes/drake_abilities_hostile.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@

/datum/ability_handler/grafadreka/proc/handle_dismemberment(mob/user, mob/living/victim)

if(!victim.current_posture?.prone && victim.stat != DEAD)
return FALSE

if(!victim.butchery_data)
to_chat(user, SPAN_WARNING("\The [victim] appears to be inedible..."))
return TRUE

to_chat(user, SPAN_NOTICE("You dig into \the [victim], hunting for something edible."))
if(!do_after(user, max(2 SECONDS, victim.get_object_size() * 5), victim) || QDELETED(victim) || !victim.butchery_data || victim.stat != DEAD)
return TRUE

var/list/external_organs = victim.get_external_organs()
if(length(external_organs) <= 1)
user.visible_message(SPAN_DANGER("\The [user] tears \the [victim] apart!"))
victim.gib()
return TRUE

var/obj/item/organ/external/limb = victim.get_organ(user.get_target_zone())
if(!limb)
to_chat(user, SPAN_WARNING("\The [victim] is missing that limb!"))
return TRUE

user.visible_message(SPAN_DANGER("\The [user] tears \the [limb] from \the [victim]!"))
limb.dismember(FALSE, DISMEMBER_METHOD_EDGE, silent = TRUE)
if(!QDELETED(limb))
user.put_in_hands(limb)
return TRUE

/datum/ability_handler/grafadreka/proc/handle_organ_destruction(mob/user, obj/item/organ/chewtoy)
if(!chewtoy.is_internal())
user.visible_message(SPAN_DANGER("\The [user] tears apart \the [chewtoy]."))
chewtoy.physically_destroyed()
else if(BP_IS_PROSTHETIC(chewtoy))
to_chat(user, SPAN_WARNING("\The [chewtoy] seems to be inedible."))
else
user.visible_message(SPAN_DANGER("\The [user] nibbles on \the [chewtoy]."))
chewtoy.convert_to_food(user)
return TRUE
38 changes: 38 additions & 0 deletions mods/species/drakes/drake_attacks.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/proc/drake_infect_wounds(var/obj/item/organ/external/bitten)
var/list/open_wounds = list()
for(var/datum/wound/wound in bitten?.wounds)
if(wound.damage_type != CUT)
continue
if(wound.is_treated())
continue
open_wounds += wound
var/germs_per_wound = max(1, round(rand(50,80) / length(open_wounds)))
for(var/datum/wound/wound in open_wounds)
wound.germ_level += germs_per_wound
wound.disinfected = FALSE

// 50% damage bonus on prone, stunned or confused enemies.
/decl/natural_attack/bite/sharp/drake/get_unarmed_damage(mob/living/user, mob/living/victim)
. = ..()
if(victim.current_posture?.prone || HAS_STATUS(victim, STAT_CONFUSE) || HAS_STATUS(victim, STAT_STUN))
. = max(1, round(. * 1.5))

/decl/natural_attack/claws/strong/drake/get_unarmed_damage(mob/living/user, mob/living/victim)
. = ..()
if(victim.current_posture?.prone || HAS_STATUS(victim, STAT_CONFUSE) || HAS_STATUS(victim, STAT_STUN))
. = max(1, round(. * 1.5))

// Raises germ level of wounds on attack.
/decl/natural_attack/bite/sharp/drake/apply_effects(mob/living/user, mob/living/target, attack_damage, zone)
. = ..()
if(. && drake_spend_sap(user, 5))
var/obj/item/organ/external/bit = target.get_organ(zone)
if(bit)
drake_infect_wounds(bit)

/decl/natural_attack/claws/strong/drake/apply_effects(mob/living/user, mob/living/target, attack_damage, zone)
. = ..()
if(. && drake_spend_sap(user, 5))
var/obj/item/organ/external/bit = target.get_organ(zone)
if(bit)
drake_infect_wounds(bit)
Loading

0 comments on commit 9e97eb6

Please sign in to comment.