diff --git a/game/03-JavaScript/05-renderer/00-combat.js b/game/03-JavaScript/05-renderer/00-combat.js index 008974c0a49c0b6c414701ef4337825176b813e1..885994cc8ac427a0002943e6d84189d9abfb1630 100644 --- a/game/03-JavaScript/05-renderer/00-combat.js +++ b/game/03-JavaScript/05-renderer/00-combat.js @@ -207,7 +207,7 @@ class CombatSystem { } isFeetActive() { - const activeUse = V.feetuse === "penis"; + const activeUse = V.feetuse === "penis" || V.feetstate === "tentacle"; return !!activeUse; } diff --git a/game/03-JavaScript/05-renderer/19-npc-canvas-helper.js b/game/03-JavaScript/05-renderer/19-npc-canvas-helper.js index d54be9e7889106c218734cb8965b12ffecabbd52..d317d733c4cc6ad33af4b10bce8cd77e868be738 100644 --- a/game/03-JavaScript/05-renderer/19-npc-canvas-helper.js +++ b/game/03-JavaScript/05-renderer/19-npc-canvas-helper.js @@ -311,6 +311,46 @@ class NpcCanvasHelper { return Object.assign(defaults, overrideOptions); } + static genPenetratorInternalEjaculationLayer(overrideOptions = {}) { + /** + * @type {CanvasModelLayers<NpcOptions>} + */ + const defaults = { + srcfn(options) { + const penetrator = options.penetrators[0]; + if (penetrator == null) { + return ""; + } + let cavity; + if (penetrator.position === "vagina") cavity = "vaginal"; + if (penetrator.position === "anus") cavity = "anal"; + if (penetrator.position === "mouth") cavity = "oral"; + return `${options.src}/body/${cavity}/${cavity}cum.png`; + }, + showfn(options) { + const penetrator = options.penetrators[0]; + if (penetrator == null || !["vagina", "anus", "mouth", null].includes(penetrator.position)) { + return false; + } + return penetrator.show && penetrator.state === "penetrating" && penetrator.isEjaculating; + }, + animationfn(options) { + return options.animKey; + }, + zfn(options) { + const penetrator = options.penetrators[0]; + if (penetrator == null) { + return 0; + } + if (penetrator.position === "mouth") { + return 73; + } + return 50; + }, + }; + return Object.assign(defaults, overrideOptions); + } + static genCondomLayer(overrideOptions = {}) { /** * @type {CanvasModelLayers<NpcOptions>} diff --git a/game/03-JavaScript/05-renderer/20-canvasmodel-combat-close-vagina.js b/game/03-JavaScript/05-renderer/20-canvasmodel-combat-close-vagina.js index 500c2c3d682f89ed4d059f9340c0013d7e849903..001df8282340858ce38973aa0f78e1cf0ff36966 100644 --- a/game/03-JavaScript/05-renderer/20-canvasmodel-combat-close-vagina.js +++ b/game/03-JavaScript/05-renderer/20-canvasmodel-combat-close-vagina.js @@ -163,7 +163,7 @@ const combatCloseVagina = { if (options.vagina.npc === "tentacle") { return true; } - return wearingCondom(V.vaginatarget) !== "worn" && !npcHasStrapon(V.vaginatarget); + return wearingCondom(V.vaginatarget) !== "worn" && !npcHasStrapon(V.vaginatarget) && !playerChastity("vagina"); }, animationfn(options) { return options.animKeyVagina; diff --git a/game/03-JavaScript/05-renderer/20-canvasmodel-combat-npc.js b/game/03-JavaScript/05-renderer/20-canvasmodel-combat-npc.js index 54bd1c9a4b302bb4bd278d096934732fa021a65d..7d0d165e63afbdb11a7a81057a91bb3035841ca4 100644 --- a/game/03-JavaScript/05-renderer/20-canvasmodel-combat-npc.js +++ b/game/03-JavaScript/05-renderer/20-canvasmodel-combat-npc.js @@ -96,6 +96,7 @@ const combatMainNpc = { }, npcPenetrator: NpcCanvasHelper.genPenetratorLayer(), npcPenetratorEjaculate: NpcCanvasHelper.genPenetratorEjaculationLayer(), + npcInternalEjaculate: NpcCanvasHelper.genPenetratorInternalEjaculationLayer(), npcCondom: NpcCanvasHelper.genCondomLayer(), }, }; diff --git a/game/03-JavaScript/05-renderer/20-canvasmodel-combat-pc.js b/game/03-JavaScript/05-renderer/20-canvasmodel-combat-pc.js index c1951a336c4a5a9a7933da04132023cd38178f34..fefc2dc18769cd3b541e7168e0b0396677c5f860 100644 --- a/game/03-JavaScript/05-renderer/20-canvasmodel-combat-pc.js +++ b/game/03-JavaScript/05-renderer/20-canvasmodel-combat-pc.js @@ -454,6 +454,18 @@ const combatMainPc = { filters: ["tentacles"], z: 49, }, + tentacleAnalCum: { + srcfn(options) { + return `${options.src}body/anal/analcum.png`; + }, + showfn(options) { + return options.tentacles.anus.show && V.anusstate === "tentacledeep"; + }, + animationfn(options) { + return options.animKey; + }, + z: 50, + }, tentacleBreasts: { srcfn(options) { return `${options.src}tentacles/${options.tentacles.breasts.state}.png`; @@ -551,6 +563,18 @@ const combatMainPc = { filters: ["tentacles"], z: 72, }, + tentacleOralCum: { + srcfn(options) { + return `${options.src}body/oral/oralcum.png`; + }, + showfn(options) { + return options.tentacles.mouth.show && V.mouthstate === "tentacledeep"; + }, + animationfn(options) { + return options.animKey; + }, + z: 73, + }, tentaclePenis: { srcfn(options) { return `${options.src}tentacles/${options.tentacles.penis.state}.png`; @@ -577,6 +601,18 @@ const combatMainPc = { filters: ["tentacles"], z: 49, }, + tentacleVaginaCum: { + srcfn(options) { + return `${options.src}body/vaginal/vaginalcum.png`; + }, + showfn(options) { + return options.tentacles.vagina.show && V.vaginastate === "tentacledeep"; + }, + animationfn(options) { + return options.animKey; + }, + z: 50, + }, /* * ██████ █████ ███████ ███████ * ██ ██ ██ ██ ██ ██