So uhhhh... I guess there's stuff now.

This commit is contained in:
Marisa the Magician 2021-11-03 02:11:24 +01:00
parent bbd29ccad8
commit b830f89f22
64 changed files with 1013 additions and 2 deletions

19
LICENSE.code Normal file
View File

@ -0,0 +1,19 @@
Copyright (c) 2021 Marisa Kirisame, UnSX Team
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

1
LICENSE.data Normal file
View File

@ -0,0 +1 @@
This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

View File

@ -237,7 +237,7 @@ A very potent timed explosive. Make sure to take cover, because it hits hard. Us
*"Bottoms up!"*
This will bring you back to full health and give you a fairly decent strength boost. Do note however that **Ibuki**'s body metabolizes the drunkedness away quickly. Part of **Ellen**'s seemingly unending stash.
This will bring you back to full health and give you a fairly decent strength boost *(Enough to tear enemies apart with your bare hands)*. Do note however that **Ibuki**'s body metabolizes the drunkedness away quickly. Part of **Ellen**'s seemingly unending stash.
### Omnisight *[Computer Map]*
@ -263,6 +263,18 @@ Cheap and easy night vision goggles. Can be toggled if you wanna save that batte
The usual solution for getting into dangerous terrain. Just pop it and go for a dive.
### Aerial Amulet *[Wings of Wrath]*
*"It's surprising that this thing can even lift me off the ground."*
A convenient little magic artifact that allows you to float in mid-air. Far more comfortable than the **Gravity Suppressor**, but unlike that one, this has a weight limit *(poor **Demo-chan**, their shiny metal butt is just too damn heavy)*. Its effects can be conveniently toggled at will, allowing you to save up energy when needed.
### Safety Tether *[Chaos Device]*
*"I'm outta here, bitches."*
Allows you to make a quick escape back to the start of the map when activated. Also releases some damaging shockwaves on both endpoints in the process. Useful when you're trapped in some inescapable room, or get surrounded by an overwhelming amount of enemies.
---
## Bonus Features
@ -381,7 +393,7 @@ You'll find these either all alone or in small handfuls. The Stormbringer takes
## Compatibility
**Doom** is pretty much the baseline here. **Heretic** support could *"maybe"* be added post-release but it wouldn't really be a priority. I don't think it'd fit much with this both gameplay and story-wise. Same with **Hexen**. It's very likely that it'll remain solely **Doom** compatible and nothing more. As there's not much id-specific here like there was with **SWWM GZ**, it could also work with **Freedoom**, I suppose.
**Doom** is pretty much the baseline here. **Heretic** support will be added later on but it won't be a high priority. In regards to **Hexen** I don't think it'd fit much both gameplay and story-wise. It's very likely that it'll remain solely **Doom** and **Heretic** compatible and nothing more. As there's not much id-specific here like there was with **SWWM GZ**, it could also work with **Freedoom**, I suppose.
Note: Playing through vanilla maps with this would be considered a storyline discrepancy, but I'm not gonna stop you.

2
credits.ibuki Normal file
View File

@ -0,0 +1,2 @@
Title music:
Teque - Rock Bug Opera

19
cvarinfo.base Normal file
View File

@ -0,0 +1,19 @@
// shared cvars
nosave float oni_flashstrength = 1.0;
nosave bool oni_shaders = true;
server bool oni_blood = true;
server int oni_maxblood = 400;
server int oni_maxgibs = 100;
server int oni_maxcasings = 200;
server int oni_maxdebris = 500;
nosave bool oni_fuzz = true;
server int oni_enemydrops = 0;
server bool oni_shadows = true;
nosave int oni_shadowdist = 2000;
server int oni_pistolstart = 0;
server int oni_drlaskill = 3;
server bool oni_singlefirst = false;
nosave bool oni_weapontooltips = true;
nosave string oni_tooltipshown = "";
nosave noarchive bool oni_tooltipnote = false;
nosave int oni_playtime = 0;

View File

@ -0,0 +1 @@
Commercial Doom

3
gameinfo.txt Normal file
View File

@ -0,0 +1,3 @@
STARTUPCOLORS = "A0 00 00", "80 00 00"
STARTUPTITLE = "RED ONI"
STARTUPTYPE = "Doom"

75
gldefs.misc Normal file
View File

@ -0,0 +1,75 @@
HardwareShader Texture "graphics/tempbg.png"
{
Shader "shaders/glsl/Fuzz.fp"
Texture "noisetex" "textures/graynoise.png"
Define "ONICOLORS"
}
HardwareShader Texture "graphics/title_ibuki.png"
{
Shader "shaders/glsl/Bilinear.fp"
}
HardwareShader Texture "graphics/title_ibuki_dark.png"
{
Shader "shaders/glsl/Bilinear.fp"
}
HardwareShader Texture "graphics/title_ibuki_eye.png"
{
Shader "shaders/glsl/Bilinear.fp"
}
HardwareShader Texture "graphics/title_ibuki_smoke.png"
{
Shader "shaders/glsl/Bilinear_wave.fp"
}
HardwareShader Texture "graphics/title_smoke_0.png"
{
Shader "shaders/glsl/Bilinear.fp"
}
HardwareShader Texture "graphics/title_smoke_1.png"
{
Shader "shaders/glsl/Bilinear.fp"
}
HardwareShader Texture "graphics/title_smoke_2.png"
{
Shader "shaders/glsl/Bilinear.fp"
}
HardwareShader Texture "graphics/title_smoke_3.png"
{
Shader "shaders/glsl/Bilinear.fp"
}
HardwareShader Texture "graphics/title_smoke_4.png"
{
Shader "shaders/glsl/Bilinear.fp"
}
HardwareShader Texture "graphics/title_smoke_5.png"
{
Shader "shaders/glsl/Bilinear.fp"
}
HardwareShader Texture "graphics/title_smoke_6.png"
{
Shader "shaders/glsl/Bilinear.fp"
}
HardwareShader Texture "graphics/title_smoke_7.png"
{
Shader "shaders/glsl/Bilinear.fp"
}
HardwareShader Texture "graphics/OniLogoL.png"
{
Shader "shaders/glsl/OniLogoAnimated.fp"
Define "TEX_SZ" = "vec2(1024.,1024.)"
Define "TEX_AR" = "1."
Texture "LogoTex" "graphics/OniLogoL_Layers.png"
}
HardwareShader Texture "graphics/OniLogoR.png"
{
Shader "shaders/glsl/OniLogoAnimated.fp"
Define "TEX_SZ" = "vec2(1024.,1024.)"
Define "TEX_AR" = "1."
Texture "LogoTex" "graphics/OniLogoR_Layers.png"
}
HardwareShader Texture "graphics/M_REDONI.png"
{
Shader "shaders/glsl/OniLogoAnimated.fp"
Define "TEX_SZ" = "vec2(256.,128.)"
Define "TEX_AR" = "2."
Texture "LogoTex" "graphics/M_REDONI_Layers.png"
}

BIN
graphics/IbukiIcon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 B

BIN
graphics/M_REDONI.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

BIN
graphics/OniLogoL.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 KiB

BIN
graphics/OniLogoL_Glow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

BIN
graphics/OniLogoR.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 561 KiB

BIN
graphics/OniLogoR_Glow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

BIN
graphics/oniback.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 B

BIN
graphics/onicurs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 B

BIN
graphics/onipause.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 731 B

BIN
graphics/title_grad.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 B

BIN
graphics/title_ibuki.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 918 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
graphics/title_smoke_0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
graphics/title_smoke_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
graphics/title_smoke_2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
graphics/title_smoke_3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
graphics/title_smoke_4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
graphics/title_smoke_5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
graphics/title_smoke_6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
graphics/title_smoke_7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

24
language.def_base Normal file
View File

@ -0,0 +1,24 @@
[default]
// tags, pickups
// quit messages
QUITMSG = "Leaving already?\nI'll be waiting, sweetie...";
QUITMSG1 = "Oh, don't worry, I'm sure\nwe can have more fun later.";
QUITMSG2 = "Hope you come back soon.\nI like playing with you.";
QUITMSG3 = "You'll come back for sure.\nYou already had your first taste.";
QUITMSG4 = "If you promise to come back,\nI'll give you a nice treat.";
QUITMSG5 = "Do you like killing demons?\nLet's kill more demons next time.";
QUITMSG6 = "Farewell, my cute little player...";
QUITMSG7 = "Have you met Demo-chan?\nTheir adventures are fun too.";
QUITMSG8 = "Ah, my tits feel heavy...\nWill you hold them for me?";
QUITMSG9 = "Don't forget to stay hydrated.\nYou'll definitely need it.";
QUITMSG10 = "I suppose you need a break.\nThat's understandable, of course.";
QUITMSG11 = "Aw, leaving already?\nThat's a shame...";
// obituaries
// misc
ONI_TITLEPRESENTSA = "UnSX Team";
ONI_TITLEPRESENTSB = "presents";
ONI_TITLEMODBYA = "a mod by";
ONI_TITLEMODBYB = "Marisa Kirisame";
ONI_TITLEINTROA = "\"and he thus said to his people: do no evil, lest you wish";
ONI_TITLEINTROB = "to bring upon yourself the unyielding fury of the \crRED ONI\c-\"";
// weapon tooltips

18
language.def_menu Normal file
View File

@ -0,0 +1,18 @@
[default]
// keybinds
// skills
ONI_SKCHILL="\cv5.56x45mm\c-";
ONI_SKEASY="\cd7.62x51mm\c-";
ONI_SKNORMAL="\cf12.7x99mm\c-";
ONI_SKHARD="\ci14.5x114mm\c-";
ONI_SKHARDCORE="\cr20x102mm\c-";
ONI_SKHARDCORECONFIRM="\crAre you sure you want to do that?\nYou might get your ass kicked if you pick this.\c-\n\n(Press Y for a challenge)";
ONI_SKLUNATIC="\cm30x173mm\c-";
ONI_SKLUNATICCONFIRM="\cmYou've clearly got a death wish.\nChoose this skill if you dare.\c-\n\n(Press Y to die instantly)";
// mod menu
ONI_MTITLE = "RED ONI Options";
ONI_MCREDS = "RED ONI Credits";
// credits
ONI_CSTITLE = "UnSX Side Story: Ibuki";
ONI_CSTITLE2 = "Big Tiddy Supersoldier Goth GF";
// Help menu

3
language.modversion Normal file
View File

@ -0,0 +1,3 @@
[default]
ONI_MODVER="\crRED ONI\c- \cw0.1a \cu(Wed 3 Nov 02:11:53 CET 2021)\c-";
ONI_SHORTVER="\cw0.1a \cu(2021-11-03 02:11:53)\c-";

144
menudef.txt Normal file
View File

@ -0,0 +1,144 @@
OptionValue "SWWMEnemyDropType"
{
-1, "$SWWM_DROPS_NONE"
0, "$SWWM_DROPS_AMMO"
1, "$SWWM_DROPS_WEAPONS"
}
OptionValue "SWWMDRLASkill"
{
0, "$SWWM_DRLASKILL_BABY"
1, "$SWWM_DRLASKILL_EASY"
2, "$SWWM_DRLASKILL_NORMAL"
3, "$SWWM_DRLASKILL_HARD"
4, "$SWWM_DRLASKILL_NIGHTMARE"
5, "$SWWM_DRLASKILL_TECHNOPHOBIA"
6, "$SWWM_DRLASKILL_ARMAGEDDON"
7, "$SWWM_DRLASKILL_ADAPTIVE"
}
OptionValue "SWWMPistolStart"
{
0, "$TXT_NO"
1, "$SWWM_PISTOLSTART_MAP"
2, "$SWWM_PISTOLSTART_CLUSTER"
}
OptionMenu "OniOptionMenu"
{
Class "SWWMOptionMenu"
Title "$ONI_MTITLE"
SafeCommand "$SWWM_CRESET", "event swwmresetcvars"
StaticText " "
StaticText "$SWWM_PTITLE", "DarkRed"
SWWMPlayTime "$SWWM_PLAYTIME", "oni_playtime"
StaticText " "
StaticText "$SWWM_OTITLE", "DarkRed"
Option "$SWWM_SHADERS", "oni_shaders", "YesNo"
Slider "$SWWM_FLASH", "oni_flashstrength", 0.0, 1.0, 0.1, 1
Slider "$SWWM_BUMP", "oni_bumpstrength", 0.0, 1.0, 0.1, 1
Option "$SWWM_FUZZ", "oni_fuzz", "YesNo"
StaticText " "
StaticText "$SWWM_ETITLE", "DarkRed"
Option "$SWWM_SHADOWS", "oni_shadows", "YesNo"
ScaleSlider "$SWWM_SHADOWDIST", "oni_shadowdist", -1, 4000, 1, "$SWWM_NONE", "$SWWM_UNLIMITED"
Option "$SWWM_BLOOD", "oni_blood", "YesNo"
ScaleSlider "$SWWM_MAXBLOOD", "oni_maxblood", -1, 1000, 1, "$SWWM_NONE", "$SWWM_UNLIMITED"
ScaleSlider "$SWWM_MAXGIBS", "oni_maxgibs", -1, 1000, 1, "$SWWM_NONE", "$SWWM_UNLIMITED"
ScaleSlider "$SWWM_MAXCASINGS", "oni_maxcasings", -1, 1000, 1, "$SWWM_NONE", "$SWWM_UNLIMITED"
ScaleSlider "$SWWM_MAXDEBRIS", "oni_maxdebris", -1, 1000, 1, "$SWWM_NONE", "$SWWM_UNLIMITED"
StaticText " "
StaticText "$SWWM_BTITLE", "DarkRed"
Option "$SWWM_PISTOLSTART", "oni_pistolstart", "SWWMPistolStart"
Option "$SWWM_ENEMYDROPS", "oni_enemydrops", "SWWMEnemyDropType"
StaticText " "
StaticText "$SWWM_ITITLE", "DarkRed"
Option "$SWWM_SINGLEFIRST", "oni_singlefirst", "YesNo"
Option "$SWWM_WEAPONTOOLTIPS", "oni_weapontooltips", "YesNo"
SafeCommand "$SWWM_RESETTOOLTIPS", "event swwmresettooltips"
StaticText " "
StaticText "$SWWM_MCTITLE", "DarkRed"
Option "$SWWM_DRLASKILL", "oni_drlaskill", "SWWMDRLASkill"
StaticText " "
StaticText " "
}
AddOptionMenu "OptionsMenu"
{
Submenu "$ONI_MTITLE", "OniOptionMenu"
Submenu "$ONI_MCREDS", "OniCreditsMenu"
}
AddOptionMenu "OptionsMenuSimple"
{
Submenu "$ONI_MTITLE", "OniOptionMenu"
Submenu "$ONI_MCREDS", "OniCreditsMenu"
}
ListMenu "MainMenu"
{
Class "SWWMMainMenu"
Size Clean
Font "TewiShadedOutline", "DarkGray", "Red"
Selector "graphics/IbukiIcon.png", -24, 0
LineSpacing 36
SWWMLogo
Position 0, 56
SWWMTextItemM "$MNU_NEWGAME", "n", "PlayerclassMenu"
SWWMTextItemM "$MNU_OPTIONS", "o", "OptionsMenu"
SWWMTextItemM "$MNU_GAMEFILES", "g", "GameFilesMenu"
SWWMTextItemM "$MNU_INFO", "i", "ReadThisMenu"
SWWMTextItemM "$MNU_QUITGAME", "q", "QuitMenu"
}
ListMenu "MainMenuTextOnly"
{
Class "SWWMMainMenu"
Size Clean
Font "TewiShadedOutline", "DarkGray", "Red"
Selector "graphics/IbukiIcon.png", -24, 0
LineSpacing 36
SWWMLogo
Position 0, 56
SWWMTextItemM "$MNU_NEWGAME", "n", "PlayerclassMenu"
SWWMTextItemM "$MNU_OPTIONS", "o", "OptionsMenu"
SWWMTextItemM "$MNU_GAMEFILES", "g", "GameFilesMenu"
SWWMTextItemM "$MNU_INFO", "i", "ReadThisMenu"
SWWMTextItemM "$MNU_QUITGAME", "q", "QuitMenu"
}
ListMenu "GameFilesMenu"
{
Class "SWWMCleanMenu"
Size Clean
Font "TewiShadedOutline", "DarkGray", "Red"
Selector "graphics/IbukiIcon.png", -24, 0
LineSpacing 36
Position 0, 88
SWWMTextItemM "$MNU_LOADGAME", "l", "LoadGameMenu"
SWWMTextItemM "$MNU_SAVEGAME", "s", "SaveGameMenu"
}
ListMenu "EpisodeMenu"
{
Class "SWWMBigMenuHack"
Size Clean
IfGame(Doom, Heretic, Hexen, Strife)
{
NetgameMessage "$NEWGAME"
}
IfGame(Chex)
{
NetgameMessage "$CNEWGAME"
}
Font "TewiShadedOutline", "DarkGray", "Red"
Selector "graphics/IbukiIcon.png", -24, 0
LineSpacing 0
SWWMStaticTextM 0, 0, "$MNU_EPISODE", "DarkRed"
Position 0, 0
}
ListMenu "SkillMenu"
{
Class "SWWMBigMenuHack"
Size Clean
Font "TewiShadedOutline", "DarkGray", "Red"
Selector "graphics/IbukiIcon.png", -24, 0
LineSpacing 0
SWWMStaticTextM 0, 0, "$MNU_CHOOSESKILL", "DarkRed"
Position 0, 0
}

BIN
music/ibuki_pretitlemus.ogg Normal file

Binary file not shown.

BIN
music/ibuki_titlemus.ogg Normal file

Binary file not shown.

View File

@ -0,0 +1,25 @@
// This should act as Bilinear filtering when texture filtering is disabled
// the algo is pretty much public domain, so no credit given
vec4 BilinearSample( in vec2 size, in vec2 pxsize, in vec2 pos )
{
vec2 f = fract(pos*size);
pos += (.5-f)*pxsize;
vec4 p0q0 = texture(tex,pos);
vec4 p1q0 = texture(tex,pos+vec2(pxsize.x,0));
vec4 p0q1 = texture(tex,pos+vec2(0,pxsize.y));
vec4 p1q1 = texture(tex,pos+vec2(pxsize.x,pxsize.y));
vec4 pInterp_q0 = mix(p0q0,p1q0,f.x);
vec4 pInterp_q1 = mix(p0q1,p1q1,f.x);
return mix(pInterp_q0,pInterp_q1,f.y);
}
void SetupMaterial( inout Material mat )
{
vec2 size = textureSize(tex,0);
vec2 pxsize = vec2(1./size.x,1./size.y);
vec2 pos = vTexCoord.st;
pos.x += .15*sin(pos.y*6.+timer*1.4)*clamp(.9-pos.y,0.,1.);
mat.Base = BilinearSample(size,pxsize,pos);
mat.Normal = ApplyNormalMap(pos);
}

View File

@ -0,0 +1,99 @@
// ah shit here we go again
#define overlay(a,b) (a<0.5)?(2.0*a*b):(1.0-(2.0*(1.0-a)*(1.0-b)))
const float pi = 3.14159265358979323846;
vec2 warpcoord( in vec2 uv )
{
vec2 offset = vec2(0,0);
offset.x = sin(pi*2.*(uv.x*2.*TEX_AR+timer*.125))*.02;
offset.y += timer*.25;
offset.x = cos(pi*2.*(uv.y*2.+timer*.125))*.02;
return fract(uv+offset);
}
vec2 warpcoord2( in vec2 uv )
{
vec2 offset = vec2(0,0);
offset.y = sin(pi*2.*(uv.x*4.*TEX_AR+timer*.25))*.01;
offset.x = cos(pi*2.*(uv.y*4.+timer*.25))*.01;
return fract(uv+offset);
}
// based on gimp color to alpha, but simplified
vec4 blacktoalpha( in vec4 src )
{
vec4 dst = src;
float dist = 0., alpha = 0.;
float d, a;
a = clamp(dst.r,0.,1.);
if ( a > alpha )
{
alpha = a;
dist = d;
}
a = clamp(dst.g,0.,1.);
if ( a > alpha )
{
alpha = a;
dist = d;
}
a = clamp(dst.b,0.,1.);
if ( a > alpha )
{
alpha = a;
dist = d;
}
if ( alpha > 0. )
{
float ainv = 1./alpha;
dst.rgb *= ainv;
}
dst.a *= alpha;
return dst;
}
void SetupMaterial( inout Material mat )
{
// y'all ready for this multilayered madness?
vec2 uv = vTexCoord.st;
// copy
vec4 base = texture(LogoTex,uv*vec2(.25,.5));
// blend with mask
vec4 tmp = texture(LogoTex,warpcoord(uv)*vec2(.25,.5)+vec2(.25,0.));
vec4 tmp2 = texture(LogoTex,uv*vec2(.25,.5)+vec2(.5,0.));
base.rgb = mix(base.rgb,tmp.rgb,tmp2.r);
// overlay with alpha
tmp = texture(LogoTex,uv*vec2(.25,.5)+vec2(.75,0.));
tmp2.r = overlay(base.r,tmp.r);
tmp2.g = overlay(base.g,tmp.g);
tmp2.b = overlay(base.b,tmp.b);
base.rgb = mix(base.rgb,tmp2.rgb,tmp.a);
// separate layer
tmp = texture(LogoTex,uv*vec2(.25,.5)+vec2(0.,.5));
// overlay
tmp2 = texture(LogoTex,warpcoord2(uv)*vec2(.25,.5)+vec2(.25,.5));
tmp.r = overlay(tmp.r,tmp2.r);
tmp.g = overlay(tmp.g,tmp2.g);
tmp.b = overlay(tmp.b,tmp2.b);
// multiply
tmp2 = texture(LogoTex,uv*vec2(.25,.5)+vec2(.5,.5));
tmp.rgb *= tmp2.rgb;
// overlay again
tmp2 = texture(LogoTex,uv*vec2(.25,.5)+vec2(.75,.5));
tmp.r = overlay(tmp.r,tmp2.r);
tmp.g = overlay(tmp.g,tmp2.g);
tmp.b = overlay(tmp.b,tmp2.b);
// color to alpha and paste on top
tmp = blacktoalpha(tmp);
base.rgb = mix(base.rgb,tmp.rgb,tmp.a);
base.a = min(base.a+tmp.a,1.);
// clamp borders
vec2 sz = TEX_SZ;
vec2 px = uv*sz;
if ( (px.x <= 1) || (px.x >= (sz.x-1)) || (px.y <= 1) || (px.y >= (sz.y-1)) )
base = vec4(0.);
// ding, logo's done
mat.Base = base;
mat.Normal = ApplyNormalMap(vTexCoord.st);
}

14
sndinfo.txt Normal file
View File

@ -0,0 +1,14 @@
$pitchshiftrange 0
aa12/fire1 sounds/aa12/aa12_fire1.ogg
aa12/fire2 sounds/aa12/aa12_fire2.ogg
aa12/fire3 sounds/aa12/aa12_fire3.ogg
$random aa12/fire { aa12/fire1 aa12/fire2 aa12/fire3 }
aa12/magin sounds/aa12/aa12_magin.ogg
aa12/magout sounds/aa12/aa12_magout.ogg
aa12/boltback sounds/aa12/aa12_boltback.ogg
aa12/boltforward sounds/aa12/aa12_boltforward.ogg
aa12/titlecock sounds/aa12/aa12_titlecock.ogg
aa12/titlefire sounds/aa12/aa12_titlefire.ogg
title/thump sounds/titlethump.ogg

Binary file not shown.

Binary file not shown.

BIN
sounds/aa12/aa12_fire1.ogg Normal file

Binary file not shown.

BIN
sounds/aa12/aa12_fire2.ogg Normal file

Binary file not shown.

BIN
sounds/aa12/aa12_fire3.ogg Normal file

Binary file not shown.

BIN
sounds/aa12/aa12_magin.ogg Normal file

Binary file not shown.

BIN
sounds/aa12/aa12_magout.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
sounds/titlethump.ogg Normal file

Binary file not shown.

8
tools/excl.lst Normal file
View File

@ -0,0 +1,8 @@
.git
*.md
docimg
models/*.blend
models/*.blend1
models/*.xcf
models/modelnotes.txt
tools

11
tools/mkpk3.sh Executable file
View File

@ -0,0 +1,11 @@
#!/bin/sh
WORKDIR=$(readlink -f $0 | sed 's/\(ibuki_m\)\(.*\)/\1/')
LIBDIR=${WORKDIR}/../swwmgzlib_m
DESTFILE=${WORKDIR}/../ibuki${1}_m.pk3
mkdir -p /tmp/tempwork
pushd /tmp/tempwork
cp -ar $LIBDIR/* .
cp -ar $WORKDIR/* .
7z a -tzip -mx=9 -x@tools/excl.lst -up0q0r2x2y2z1w2 $DESTFILE '*'
popd
rm -rf /tmp/tempwork

5
tools/mkpk7.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/sh
WORKDIR=$(readlink -f $0 | sed 's/\(ibuki_m\)\(.*\)/\1/')
pushd "$WORKDIR"
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off -x@tools/excl.lst -up0q0r2x2y2z1w2 ../ibuki${1}_m.pk7 '../swwmgzlib_m/*' '*'
popd

137
zmapinfo.txt Normal file
View File

@ -0,0 +1,137 @@
GameInfo
{
AddEventHandlers = "SWWMStaticHandler", "SWWMHandler"
//PlayerClasses = "IbukiPlayer"
//StatusBarClass = "OniStatusBar"
BackpackType = "HammerspaceEmbiggener"
QuitSound = "misc/teleport"
QuitMessages = "$QUITMSG", "$QUITMSG1", "$QUITMSG2", "$QUITMSG3",
"$QUITMSG4", "$QUITMSG5", "$QUITMSG6", "$QUITMSG7",
"$QUITMSG8", "$QUITMSG9", "$QUITMSG10", "$QUITMSG11"
ChatSound = "misc/chat"
NoMergePickupMsg = true
CursorPic = "graphics/onicurs.png"
DimColor = "Black"
DimAmount = 0.5
BlurAmount = 0
Endoom = "ENDIBUKI"
PickupColor = "White"
MenuFontColor_Title = "DarkRed"
MenuFontColor_Label = "DarkGray"
MenuFontColor_Value = "DarkRed"
MenuFontColor_Action = "DarkGray"
MenuFontColor_Header = "DarkRed"
MenuFontColor_Highlight = "Red"
MenuFontColor_Selection = "Red"
MenuSliderColor = "DarkRed"
MenuSliderBackColor = "DarkGray"
MenuBackButton = "graphics/oniback.png"
MessageBoxClass = "SWWMMessageBox"
//HelpMenuClass = "OniHelpMenu"
MenuDelegateClass = "SWWMMenuDelegate"
PauseSign = "graphics/onipause.png"
//BorderFlat = "graphics/bord_flat.png"
//Border = 2, 0, "graphics/bord_tr.png", "graphics/bord_t.png", "graphics/bord_tl.png", "graphics/bord_r.png", "graphics/bord_l.png", "graphics/bord_br.png", "graphics/bord_b.png", "graphics/bord_bl.png"
ForceTextInMenus = true
TelefogHeight = 28
// precache all intro sounds
PrecacheSounds = "aa12/titlecock", "aa12/titlefire", "title/thump"
// precache all intro textures, to avoid hiccups
PrecacheTextures = "graphics/OniLogoL.png",
"graphics/OniLogoL_Glow.png",
"graphics/OniLogoL_Layers.png",
"graphics/OniLogoR.png",
"graphics/OniLogoR_Glow.png",
"graphics/OniLogoR_Layers.png",
"graphics/title_grad.png",
"graphics/title_ibuki.png",
"graphics/title_ibuki_dark.png",
"graphics/title_ibuki_eye.png",
"graphics/title_ibuki_smoke.png",
"graphics/title_smoke_0.png",
"graphics/title_smoke_1.png",
"graphics/title_smoke_2.png",
"graphics/title_smoke_3.png",
"graphics/title_smoke_4.png",
"graphics/title_smoke_5.png",
"graphics/title_smoke_6.png",
"graphics/title_smoke_7.png",
"graphics/M_REDONI.png",
"graphics/M_REDONI_Layers.png"
}
ClearSkills
Skill chill
{
AutoUseHealth
DamageFactor = 0.5
EasyBossBrain
SlowMonsters
SpawnFilter = baby
ACSReturn = 0
Name = "$ONI_SKCHILL"
}
Skill easy
{
DamageFactor = 0.75
SpawnFilter = easy
ACSReturn = 1
Name = "$ONI_SKEASY"
}
Skill normal
{
SpawnFilter = normal
ACSReturn = 2
Name = "$ONI_SKNORMAL"
DefaultSkill
}
Skill hard
{
DamageFactor = 1.25
SpawnFilter = hard
ACSReturn = 3
Name = "$ONI_SKHARD"
}
Skill hardcore
{
DisableCheats
FastMonsters
HealthFactor = 1.5
DamageFactor = 1.5
Aggressiveness = 0.25
SpawnFilter = nightmare
SpawnMulti
ACSReturn = 4
Name = "$ONI_SKHARDCORE"
MustConfirm = "$ONI_SKHARDCORECONFIRM"
}
Skill lunatic
{
DisableCheats
HealthFactor = 2.0
DamageFactor = 2.0
Aggressiveness = 1.0
SpawnFilter = nightmare
SpawnMulti
TotalInfighting
InstantReaction
NoPain
ACSReturn = 4
Name = "$ONI_SKLUNATIC"
MustConfirm = "$ONI_SKLUNATICCONFIRM"
}
Map TITLEMAP "RED ONI Title Map"
{
Music = ""
EventHandlers = "OniTitleStuff"
}
DamageType EndLevel
{
NoArmor
Obituary = "$O_ENDLEVEL"
}

73
zscript.txt Normal file
View File

@ -0,0 +1,73 @@
version "4.7.1"
/*
RED ONI Main Codebase
(C)2021 Marisa Kirisame, UnSX Team
This copyright and the attached LICENSE.code file apply to all files
included from here, with the exception of any third-party libraries
*/
/// SWWM GZ Common Library
// library constants
const SWWMMODPREFIX = "oni";
const SWWMMAXBACKPACK = 8;
const SWWMHEALTHFLASH = Color(64,96,255);
const SWWMARMORFLASH = Color(255,224,64);
const SWWMLOGONAME = "M_REDONI";
const SWWMCREDITSCOL0 = Font.CR_DARKRED;
const SWWMCREDITSCOL1 = Font.CR_RED;
const SWWMCREDITSCOL2 = Font.CR_DARKGRAY;
// Gutamatics
#include "zscript/swwm_Gutamatics/Include.zsc"
// utility code
#include "zscript/utility/swwm_coordutil.zsc"
#include "zscript/utility/swwm_utility.zsc"
// base code
#include "zscript/swwm_common.zsc"
#include "zscript/swwm_common_fx.zsc"
#include "zscript/swwm_handler.zsc"
#include "zscript/swwm_statichandler.zsc"
#include "zscript/swwm_thinkers.zsc"
#include "zscript/swwm_player.zsc"
#include "zscript/swwm_blod.zsc"
// handler code
#include "zscript/handler/swwm_handler_damage.zsc"
#include "zscript/handler/swwm_handler_flash.zsc"
#include "zscript/handler/swwm_handler_iwantdie.zsc"
#include "zscript/handler/swwm_handler_process.zsc"
#include "zscript/handler/swwm_handler_queues.zsc"
#include "zscript/handler/swwm_handler_replacements.zsc"
#include "zscript/handler/swwm_handler_worldload.zsc"
#include "zscript/handler/swwm_handler_worldthings.zsc"
// menu code
#include "zscript/menu/swwm_menus.zsc"
#include "zscript/menu/swwm_credits.zsc"
// compat code
#include "zscript/compat/swwm_compat.zsc"
// hud
#include "zscript/hud/swwm_hudextra.zsc"
// items
#include "zscript/items/swwm_baseitem.zsc"
#include "zscript/items/swwm_basehealth.zsc"
#include "zscript/items/swwm_basearmor.zsc"
#include "zscript/items/swwm_baseammo.zsc"
#include "zscript/items/swwm_ammoextra.zsc"
// weapons
#include "zscript/weapons/swwm_baseweapon.zsc"
#include "zscript/weapons/swwm_baseweapon_fx.zsc"
#include "zscript/weapons/swwm_baseweapon_melee.zsc"
// monsters
#include "zscript/swwm_monsters.zsc"
/// RED ONI Specific Code
// utility code
#include "zscript/utility/oni_utility.zsc"
// base code
#include "zscript/oni_player.zsc"
// handler code
#include "zscript/handler/oni_handler_shaders.zsc"
#include "zscript/handler/oni_handler_replacements.zsc"
#include "zscript/handler/oni_statichandler_fonts.zsc"
// menu code
#include "zscript/menu/oni_title.zsc"
#include "zscript/menu/oni_credits.zsc"

View File

@ -0,0 +1,10 @@
// Red Oni replacements
extend Class SWWMHandler
{
private bool ModReplacement( ReplaceEvent e )
{
// nothing here yet
return false;
}
}

View File

@ -0,0 +1,12 @@
extend Class SWWMHandler
{
private ui void RenderShaders( RenderEvent e )
{
// nothing here yet
}
static clearscope void ClearAllShaders( PlayerInfo p, bool noscope = false )
{
// nothing here yet
}
}

View File

@ -0,0 +1,7 @@
extend Class SWWMStaticHandler
{
private void PreloadModFonts()
{
// nothing here yet
}
}

View File

@ -0,0 +1,14 @@
// mod credits
Class OniCreditsMenu : SWWMCreditsMenu
{
override void ChildInit( Menu parent )
{
cmusic.Push(new("SWWMCreditsEntry").Init(sfnt,"BouncyTEM","???"));
cmusic.Push(new("SWWMCreditsEntry").Init(sfnt,"Teque","Rock Bug Opera"));
}
override String, int GetCreditsMus()
{
return "music/ibuki_titlemus.ogg", 0;
}
}

258
zscript/menu/oni_title.zsc Normal file
View File

@ -0,0 +1,258 @@
// Things for the titlemap
Struct TitleSmoke
{
int age, maxage;
Vector2 pos, vel;
double ang, angvel;
double scale;
}
Class OniTitleStuff : EventHandler
{
ui TextureID bgtex;
ui Font TewiFont, MPlusFont;
ui CVar dofuzz;
ui TextureID ibukitex[4];
ui TitleSmoke smk[128];
ui Shape2D smk_shape;
ui Shape2DTransform smk_tform;
ui TextureID smk_tex[8];
ui TextureID logotex[4];
ui TextureID gradtex;
ui int quakestr;
ui int rss;
private ui int GetUIRandom()
{
return (rss = (rss<<1)*35447+(rss/87));
}
private ui double RandomShiver()
{
int sd = GetUIRandom();
return ((abs(sd)%11)-5)*.1;
}
// returns MPlus if we're playing in Japanese, otherwise returns the requested font
private ui Font LangFont( Font req )
{
if ( language ~== "jp" ) return MPlusFont;
return req;
}
private ui void TickSmokeLayers()
{
for ( int i=0; i<128; i++ )
{
int presim = 0;
if ( smk[i].age >= smk[i].maxage )
{
if ( smk[i].maxage == 0 ) presim = Random[UIStuff](0,60);
else presim = -1;
smk[i].age = Random[UIStuff](-20,0);
smk[i].maxage = Random[UIStuff](60,120);
smk[i].pos = (FRandom[UIStuff](-512.,512.),FRandom[UIStuff](0.,256.));
smk[i].vel = (FRandom[UIStuff](-1.,3.),FRandom[UIStuff](-2.,-6.));
smk[i].ang = FRandom[UIStuff](0.,360.);
smk[i].angvel = FRandom[UIStuff](1.,4.)*RandomPick[UIStuff](-1,1);
smk[i].scale = FRandom[UIStuff](256.,512.);
}
for ( int j=0; j<=presim; j++ )
{
smk[i].age++;
if ( smk[i].age <= 0 ) continue;
smk[i].pos += smk[i].vel;
smk[i].ang += smk[i].angvel;
}
}
}
override void UiTick()
{
quakestr = max(quakestr-1,0);
if ( level.maptime == 1 ) S_ChangeMusic("music/ibuki_pretitlemus.ogg",looping:false);
else if ( level.maptime == (43*GameTicRate) ) S_StartSound("aa12/titlecock",CHAN_WEAPON,CHANF_OVERLAP|CHANF_UI,1.,0.);
else if ( level.maptime == (44*GameTicRate) ) S_StartSound("aa12/titlefire",CHAN_WEAPON,CHANF_OVERLAP|CHANF_UI,1.,0.);
else if ( level.maptime == (46*GameTicRate) )
{
quakestr += 30;
S_StartSound("title/thump",CHAN_BODY,CHANF_OVERLAP|CHANF_UI,1.,0.,1.);
}
else if ( level.maptime == (47*GameTicRate) )
{
quakestr += 30;
S_StartSound("title/thump",CHAN_BODY,CHANF_OVERLAP|CHANF_UI,1.,0.,.8);
}
else if ( level.maptime == (50*GameTicRate) ) S_ChangeMusic("music/ibuki_titlemus.ogg");
TickSmokeLayers();
if ( gamestate != GS_LEVEL ) return;
// you're not supposed to be here
Menu.SetMenu('EndGameMenu');
let m = MessageBoxMenu(Menu.GetCurrentMenu());
if ( m ) m.HandleResult(true);
// special thanks to marrub for this absolute crime
}
// heh
private clearscope double smerp( double a ) const
{
return (sin((a-.5)*180.)+1.)/2.;
}
private ui void RenderSmokeLayer( RenderEvent e, double GameSecs, bool back, double alpha = 1., double disp = 0., bool zoomout = false )
{
if ( !smk_shape )
{
smk_shape = new("Shape2D");
smk_shape.PushVertex((-1,-1));
smk_shape.PushVertex((1,-1));
smk_shape.PushVertex((-1,1));
smk_shape.PushVertex((1,1));
smk_shape.PushCoord((0,0));
smk_shape.PushCoord((1,0));
smk_shape.PushCoord((0,1));
smk_shape.PushCoord((1,1));
smk_shape.PushTriangle(0,3,1);
smk_shape.PushTriangle(0,2,3);
}
if ( !smk_tform ) smk_tform = new("Shape2DTransform");
double zoomscl = Screen.GetHeight()/(zoomout?600:400.);
int imin = back?64:0;
int imax = back?128:64;
int base = zoomout?(back?450:750):(back?500:300);
for ( int i=imin; i<imax; i++ )
{
if ( !smk_tex[i%8] ) smk_tex[i%8] = TexMan.CheckForTexture("graphics/title_smoke_"..(i%8)..".png",TexMan.Type_Any);
smk_tform.Clear();
// base transforms
smk_tform.Scale((1,1)*smk[i].scale);
smk_tform.Rotate(smk[i].ang+smk[i].angvel*e.FracTic);
smk_tform.Translate(smk[i].pos+smk[i].vel*e.FracTic);
// screen transforms
smk_tform.Translate((0,base+disp));
smk_tform.Scale((1,1)*zoomscl);
smk_tform.Translate((Screen.GetWidth()/2,0));
smk_shape.SetTransform(smk_tform);
double alf = cos((smk[i].age/double(smk[i].maxage))*90)*alpha;
alf *= clamp(smk[i].age/10.,0,1);
Screen.DrawShape(smk_tex[i%8],false,smk_shape,DTA_Alpha,alf,DTA_LegacyRenderStyle,STYLE_AddShaded,DTA_FillColor,Color(4,16,48));
}
}
override void RenderUnderlay( RenderEvent e )
{
double GameSecs = (level.maptime+e.FracTic)/GameTicRate;
if ( !dofuzz ) dofuzz = CVar.FindCVar(SWWMMODPREFIX.."_fuzz");
if ( dofuzz.GetBool() )
{
if ( !bgtex ) bgtex = TexMan.CheckForTexture("graphics/tempbg.png",TexMan.Type_Any);
Vector2 tsize = TexMan.GetScaledSize(bgtex);
double zoom = max(ceil(Screen.GetWidth()/tsize.x),ceil(Screen.GetHeight()/tsize.y));
Vector2 vsize = (Screen.GetWidth(),Screen.GetHeight())/zoom;
Screen.DrawTexture(bgtex,false,(vsize.x-tsize.x)/2,(vsize.y-tsize.y)/2,DTA_VirtualWidthF,vsize.x,DTA_VirtualHeightF,vsize.y,DTA_KeepRatio,true,DTA_ColorOverlay,Color(128,0,0,0));
Screen.Dim(Color(16,0,0),1.-clamp((GameSecs-44),.1,1.),0,0,Screen.GetWidth(),Screen.GetHeight());
}
else Screen.Dim(Color(16,0,0),1.,0,0,Screen.GetWidth(),Screen.GetHeight());
double alf;
String str;
double zoomscl = Screen.GetHeight()/400.;
double texscl = Screen.GetHeight()/2700.;
double logoscl = max(floor(Screen.GetHeight()/1024.),1.);
// intro texts
if ( level.maptime < (42*GameTicRate) )
{
if ( !ibukitex[0] ) ibukitex[0] = TexMan.CheckForTexture("graphics/title_ibuki_dark.png",TexMan.Type_Any);
alf = clamp(GameSecs/40.,.2,1.);
double disp = smerp(clamp((GameSecs-16)/25.,0,1));
RenderSmokeLayer(e,GameSecs,true,clamp(alf*2.,.2,1.),200.*disp);
Screen.DrawTexture(ibukitex[0],false,Screen.GetWidth()/2+zoomscl*50,Screen.GetHeight()+zoomscl*1700.*disp,DTA_ScaleX,zoomscl,DTA_ScaleY,zoomscl,DTA_ColorOverlay,Color(255-int(alf*255),0,0,0));
RenderSmokeLayer(e,GameSecs,false,clamp(alf*2.,.2,1.)*.5,400.*disp);
if ( !TewiFont ) TewiFont = Font.GetFont('TewiShaded');
if ( !MPlusFont ) MPlusFont = Font.GetFont('MPlusShaded');
Font fnt = LangFont(TewiFont);
alf = clamp(GameSecs-1,0.,1.);
alf *= 1.-clamp(GameSecs-6,0.,1.);
String str = StringTable.Localize("$ONI_TITLEPRESENTSA");
Screen.DrawText(fnt,Font.CR_DARKRED,(Screen.GetWidth()-fnt.StringWidth(str)*CleanXFac)/2,(Screen.GetHeight()/2)-(fnt.GetHeight()*CleanYFac),str,DTA_CleanNoMove,true,DTA_Alpha,alf);
str = StringTable.Localize("$ONI_TITLEPRESENTSB");
Screen.DrawText(fnt,Font.CR_BLACK,(Screen.GetWidth()-fnt.StringWidth(str)*CleanXFac)/2,(Screen.GetHeight()/2),str,DTA_CleanNoMove,true,DTA_Alpha,alf);
alf = clamp(GameSecs-8,0.,1.);
alf *= 1.-clamp(GameSecs-13,0.,1.);
str = StringTable.Localize("$ONI_TITLEMODBYA");
Screen.DrawText(fnt,Font.CR_BLACK,(Screen.GetWidth()-fnt.StringWidth(str)*CleanXFac)/2,(Screen.GetHeight()/2)-(fnt.GetHeight()*CleanYFac),str,DTA_CleanNoMove,true,DTA_Alpha,alf);
str = StringTable.Localize("$ONI_TITLEMODBYB");
Screen.DrawText(fnt,Font.CR_DARKRED,(Screen.GetWidth()-fnt.StringWidth(str)*CleanXFac)/2,(Screen.GetHeight()/2),str,DTA_CleanNoMove,true,DTA_Alpha,alf);
alf = clamp(GameSecs-20,0.,1.);
alf *= 1.-clamp(GameSecs-35,0.,1.);
str = StringTable.Localize("$ONI_TITLEINTROA");
Screen.DrawText(fnt,Font.CR_BLACK,(Screen.GetWidth()-fnt.StringWidth(str)*CleanXFac)/2,(Screen.GetHeight()/2)-(fnt.GetHeight()*CleanYFac),str,DTA_CleanNoMove,true,DTA_Alpha,alf);
str = StringTable.Localize("$ONI_TITLEINTROB");
Screen.DrawText(fnt,Font.CR_BLACK,(Screen.GetWidth()-fnt.StringWidth(str)*CleanXFac)/2,(Screen.GetHeight()/2),str,DTA_CleanNoMove,true,DTA_Alpha,alf);
}
// 42 seconds in: eye glow
else if ( level.maptime < (44*GameTicRate) )
{
RenderSmokeLayer(e,GameSecs,true,1.,200.);
Screen.DrawTexture(ibukitex[0],false,Screen.GetWidth()/2+zoomscl*50,Screen.GetHeight()+zoomscl*1700,DTA_ScaleX,zoomscl,DTA_ScaleY,zoomscl);
RenderSmokeLayer(e,GameSecs,false,.5,400.);
if ( !ibukitex[1] ) ibukitex[1] = TexMan.CheckForTexture("graphics/title_ibuki_eye.png",TexMan.Type_Any);
alf = clamp((GameSecs-43)*4.,0.,1.);
Screen.DrawTexture(ibukitex[1],false,Screen.GetWidth()/2+zoomscl*50,Screen.GetHeight()+zoomscl*1700,DTA_ScaleX,zoomscl,DTA_ScaleY,zoomscl,DTA_Alpha,alf,DTA_LegacyRenderStyle,STYLE_Add);
alf *= 1.-clamp((GameSecs-43),0.,1.);
Screen.Dim("Red",(alf**2)*.3,0,0,Screen.GetWidth(),Screen.GetHeight());
}
// 44 seconds in: fade from white to full title scene
else
{
if ( level.maptime > 46*GameTicRate )
{
if ( !logotex[0] ) logotex[0] = TexMan.CheckForTexture("graphics/OniLogoL.png",TexMan.Type_Any);
if ( !logotex[2] ) logotex[2] = TexMan.CheckForTexture("graphics/OniLogoL_Glow.png",TexMan.Type_Any);
Screen.DrawTexture(logotex[0],false,Screen.GetWidth()/2-320*logoscl,-80*logoscl,DTA_ScaleX,logoscl,DTA_ScaleY,logoscl,DTA_LeftOffset,580);
if ( level.maptime < 48*GameTicRate )
Screen.DrawTexture(logotex[2],false,Screen.GetWidth()/2-320*logoscl,-80*logoscl,DTA_ScaleX,logoscl,DTA_ScaleY,logoscl,DTA_LeftOffset,580,DTA_LegacyRenderStyle,STYLE_Add,DTA_Alpha,1.-clamp(GameSecs-46,0.,1.));
}
if ( level.maptime > 47*GameTicRate )
{
if ( !logotex[1] ) logotex[1] = TexMan.CheckForTexture("graphics/OniLogoR.png",TexMan.Type_Any);
if ( !logotex[3] ) logotex[3] = TexMan.CheckForTexture("graphics/OniLogoR_Glow.png",TexMan.Type_Any);
Screen.DrawTexture(logotex[1],false,Screen.GetWidth()/2+320*logoscl,-80*logoscl,DTA_ScaleX,logoscl,DTA_ScaleY,logoscl,DTA_LeftOffset,540);
if ( level.maptime < 49*GameTicRate )
Screen.DrawTexture(logotex[3],false,Screen.GetWidth()/2+320*logoscl,-80*logoscl,DTA_ScaleX,logoscl,DTA_ScaleY,logoscl,DTA_LeftOffset,540,DTA_LegacyRenderStyle,STYLE_Add,DTA_Alpha,1.-clamp(GameSecs-47,0.,1.));
}
if ( !gradtex ) gradtex = TexMan.CheckForTexture("graphics/title_grad.png",TexMan.Type_Any);
Screen.DrawTexture(gradtex,false,0,Screen.GetHeight(),DTA_DestWidth,Screen.GetWidth(),DTA_DestHeight,256*CleanYFac_1,DTA_LegacyRenderStyle,STYLE_AddShaded,DTA_FillColor,Color(128,0,0),DTA_TopOffset,256);
RenderSmokeLayer(e,GameSecs,true,.5,0,true);
if ( !ibukitex[2] ) ibukitex[2] = TexMan.CheckForTexture("graphics/title_ibuki.png",TexMan.Type_Any);
if ( !ibukitex[3] ) ibukitex[3] = TexMan.CheckForTexture("graphics/title_ibuki_smoke.png",TexMan.Type_Any);
alf = clamp((GameSecs-44.5)*1.5,0.,1.);
rss = int(MSTime()/GameTicRate);
Vector2 ofs = (RandomShiver(),RandomShiver())*quakestr*texscl;
if ( alf < 1. )
{
Screen.DrawTexture(ibukitex[0],false,Screen.GetWidth()/2+60*texscl+ofs.x,Screen.GetHeight()+80*texscl+ofs.y,DTA_ScaleX,texscl,DTA_ScaleY,texscl,DTA_Alpha,1.-alf);
Screen.DrawTexture(ibukitex[2],false,Screen.GetWidth()/2+60*texscl+ofs.x,Screen.GetHeight()+80*texscl+ofs.y,DTA_ScaleX,texscl,DTA_ScaleY,texscl,DTA_Alpha,alf);
}
else Screen.DrawTexture(ibukitex[2],false,Screen.GetWidth()/2+60*texscl+ofs.x,Screen.GetHeight()+80*texscl+ofs.y,DTA_ScaleX,texscl,DTA_ScaleY,texscl);
alf = clamp((GameSecs-44.)*.5,0.,1.);
Screen.DrawTexture(ibukitex[3],false,Screen.GetWidth()/2+60*texscl+ofs.x,Screen.GetHeight()+80*texscl+ofs.y,DTA_ScaleX,texscl,DTA_ScaleY,texscl,DTA_LegacyRenderStyle,STYLE_Add,DTA_Alpha,alf*.5);
Screen.DrawTexture(ibukitex[1],false,Screen.GetWidth()/2+60*texscl+ofs.x,Screen.GetHeight()+80*texscl+ofs.y,DTA_ScaleX,texscl,DTA_ScaleY,texscl,DTA_LegacyRenderStyle,STYLE_Add);
RenderSmokeLayer(e,GameSecs,false,1.,0,true);
Screen.DrawTexture(gradtex,false,0,Screen.GetHeight(),DTA_DestWidth,Screen.GetWidth(),DTA_DestHeight,64*CleanYFac_1,DTA_LegacyRenderStyle,STYLE_Shaded,DTA_FillColor,Color(128,0,0),DTA_TopOffset,256);
if ( level.maptime < (45*GameTicRate) )
{
alf = 1.-clamp((GameSecs-44),0.,1.);
Screen.Dim("White",alf,0,0,Screen.GetWidth(),Screen.GetHeight());
}
if ( quakestr > 0. )
{
alf = (quakestr-e.fractic)/60.;
Screen.Dim(Color(255,64,0),alf,0,0,Screen.GetWidth(),Screen.GetHeight());
}
}
// global fade in from back
if ( level.maptime < (1*GameTicRate) )
Screen.Dim("Black",1.-clamp(GameSecs,0.,1.),0,0,Screen.GetWidth(),Screen.GetHeight());
}
}

3
zscript/oni_player.zsc Normal file
View File

@ -0,0 +1,3 @@
Class IbukiPlayer : SWWMPlayer
{
}

View File

@ -0,0 +1,14 @@
// mod-specific utility code
extend Class SWWMUtility
{
// IsZeroDamage() can lead to some false negatives, we have to account for that
static play bool ValidProjectile( Actor a )
{
if ( !a.bMISSILE ) return false;
// TODO add mod projectiles here
if ( !a.IsZeroDamage() ) return true;
return false;
}
// TODO slot replacers
}