-
Notifications
You must be signed in to change notification settings - Fork 222
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
dcc8e86
commit 9e97eb6
Showing
36 changed files
with
807 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
Oops, something went wrong.