- moved the windows to use layouts

- various gui-work
- begun binding the GUI into Monster script
- updated to latest Monster source (0.11 alpha)


git-svn-id: https://openmw.svn.sourceforge.net/svnroot/openmw/trunk@87 ea6a568a-9f4f-0410-981a-c910a81bb256
actorid
nkorslund 16 years ago
parent 9530ae0526
commit 2995f8b99f

@ -65,13 +65,13 @@ all: openmw esmtool niftool bsatool bored
cpp: cpp_ogre.o cpp_avcodec.o cpp_bullet.o cpp: cpp_ogre.o cpp_avcodec.o cpp_bullet.o
cpp_ogre.o: $(ogre_cpp_files) cpp_ogre.o: $(ogre_cpp_files)
$(OGCC) -c $< $(OGCC) -o $@ -c $<
cpp_avcodec.o: $(avcodec_cpp_files) cpp_avcodec.o: $(avcodec_cpp_files)
$(AVGCC) -c $< $(AVGCC) -o $@ -c $<
cpp_bullet.o: $(bullet_cpp_files) cpp_bullet.o: $(bullet_cpp_files)
$(BGCC) -c $< $(BGCC) -o $@ -c $<
objs/%.o: %.d objs/%.o: %.d
dirname $@ | xargs mkdir -p dirname $@ | xargs mkdir -p

@ -150,7 +150,7 @@ extern "C" int32_t bullet_init()
// ------- SET UP THE PLAYER ------- // ------- SET UP THE PLAYER -------
// Create the player collision shape. // Create the player collision shape.
float width = 50; float width = 30;
/* /*
float height = 50; float height = 50;

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

@ -10,7 +10,7 @@
<Property key="FontName" value = "MyGUI_CoreFont.18" /> <Property key="FontName" value = "MyGUI_CoreFont.18" />
<Property key="FontHeight" value = "18" /> <Property key="FontHeight" value = "18" />
<Property key="AlignText" value = "ALIGN_DEFAULT" /> <Property key="AlignText" value = "ALIGN_DEFAULT" />
<Property key="Colour" value = "0 0 0" /> <Property key="Colour" value = "0.7 0.7 0.7" />
<BasisSkin type="SimpleText" offset = "0 0 16 16" align = "ALIGN_STRETCH"/> <BasisSkin type="SimpleText" offset = "0 0 16 16" align = "ALIGN_STRETCH"/>
</Skin> </Skin>

@ -14,8 +14,11 @@
<List file="openmw_text.skin.xml" group="General"/> <List file="openmw_text.skin.xml" group="General"/>
<List file="openmw_windows.skin.xml" group="General"/> <List file="openmw_windows.skin.xml" group="General"/>
<List file="openmw_button.skin.xml" group="General"/> <List file="openmw_button.skin.xml" group="General"/>
<List file="openmw_box.skin.xml" group="General"/>
<List file="openmw_progress.skin.xml" group="General"/>
<List file="openmw_hud_energybar.skin.xml" group="General"/> <List file="openmw_hud_energybar.skin.xml" group="General"/>
<List file="openmw_hud_box.skin.xml" group="General"/> <List file="openmw_hud_box.skin.xml" group="General"/>
<List file="openmw_mainmenu_skin.xml" group="General"/>
</MyGUI> </MyGUI>
</MyGUI> </MyGUI>

@ -24,6 +24,14 @@
<Code hide="1104"/> <Code hide="1104"/>
</Font> </Font>
<Font name="daedric36" source="daedric.ttf" size="36" resolution="72" antialias_colour="false" space_width="4" tab_count="4" spacer="5">
<Code range="33 98"/>
</Font>
<Font name="daedric_orig36" source="daedric_orig.ttf" size="36" resolution="72" antialias_colour="false" space_width="4" tab_count="4" spacer="5">
<Code range="33 98"/>
</Font>
<Font name="cards" default_height="17" source="magiccards.ttf" size="18" resolution="50" antialias_colour="false" space_width="4" tab_width="8" cursor_width="2" distance="5" offset_height="0"> <Font name="cards" default_height="17" source="magiccards.ttf" size="18" resolution="50" antialias_colour="false" space_width="4" tab_width="8" cursor_width="2" distance="5" offset_height="0">
<Code range="33 98"/> <Code range="33 98"/>
</Font> </Font>

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- This file defines the box you see around many GUI elements, such
as around the sections of the stats window, or around popup info windows -->
<MyGUI type="Skin">
<!-- Box borders -->
<Skin name="IB_T" size="512 2" texture="menu_thin_border_top.dds">
<BasisSkin type="MainSkin" offset = "0 0 512 2">
<State name="normal" offset = "0 0 512 2"/>
</BasisSkin>
</Skin>
<Skin name="IB_B" size="512 2" texture="menu_thin_border_bottom.dds">
<BasisSkin type="MainSkin" offset = "0 0 512 2">
<State name="normal" offset = "0 0 512 2"/>
</BasisSkin>
</Skin>
<Skin name="IB_L" size="2 512" texture="menu_thin_border_left.dds">
<BasisSkin type="MainSkin" offset = "0 0 2 512">
<State name="normal" offset = "0 0 2 512"/>
</BasisSkin>
</Skin>
<Skin name="IB_R" size="2 512" texture="menu_thin_border_right.dds">
<BasisSkin type="MainSkin" offset = "0 0 2 512">
<State name="normal" offset = "0 0 2 512"/>
</BasisSkin>
</Skin>
<Skin name="IB_TL" size="2 2" texture="menu_thin_border_top_left_corner.dds">
<BasisSkin type="MainSkin" offset = "0 0 2 2">
<State name="normal" offset = "0 0 2 2"/>
</BasisSkin>
</Skin>
<Skin name="IB_TR" size="2 2" texture="menu_thin_border_top_right_corner.dds">
<BasisSkin type="MainSkin" offset = "0 0 2 2">
<State name="normal" offset = "0 0 2 2"/>
</BasisSkin>
</Skin>
<Skin name="IB_BL" size="2 2" texture="menu_thin_border_bottom_left_corner.dds">
<BasisSkin type="MainSkin" offset = "0 0 2 2">
<State name="normal" offset = "0 0 2 2"/>
</BasisSkin>
</Skin>
<Skin name="IB_BR" size="2 2" texture="menu_thin_border_bottom_right_corner.dds">
<BasisSkin type="MainSkin" offset = "0 0 2 2">
<State name="normal" offset = "0 0 2 2"/>
</BasisSkin>
</Skin>
<!-- Main box definition -->
<Skin name="MW_Box" size="516 516">
<Child type="Widget" skin="IB_T" offset="2 0 512 2" align="ALIGN_TOP ALIGN_HSTRETCH"/>
<Child type="Widget" skin="IB_B" offset="2 514 512 2" align="ALIGN_BOTTOM ALIGN_HSTRETCH"/>
<Child type="Widget" skin="IB_L" offset="0 2 2 512" align="ALIGN_LEFT ALIGN_VSTRETCH"/>
<Child type="Widget" skin="IB_R" offset="514 2 2 512" align="ALIGN_RIGHT ALIGN_VSTRETCH"/>
<Child type="Widget" skin="IB_TL" offset="0 0 2 2" align="ALIGN_TOP ALIGN_LEFT"/>
<Child type="Widget" skin="IB_TR" offset="514 0 2 2" align="ALIGN_TOP ALIGN_RIGHT"/>
<Child type="Widget" skin="IB_BL" offset="0 514 2 2" align="ALIGN_BOTTOM ALIGN_LEFT"/>
<Child type="Widget" skin="IB_BR" offset="514 514 2 2" align="ALIGN_BOTTOM ALIGN_RIGHT"/>
</Skin>
</MyGUI>

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<MyGUI type="Skin"> <MyGUI type="Skin">
<!-- The 'box' frame that surrounds various HUD items --> <!-- The 'box' frame that surrounds various HUD items and other elements -->
<Skin name="HUD_Box" size="40 40" texture="menu_icon_equip.dds"> <Skin name="HUD_Box" size="40 40" texture="menu_icon_equip.dds">
<BasisSkin type="SubSkin" offset="0 0 40 2" align= "ALIGN_TOP ALIGN_HSTRETCH"> <BasisSkin type="SubSkin" offset="0 0 40 2" align= "ALIGN_TOP ALIGN_HSTRETCH">
<State name="normal" offset="2 2 40 2"/> <State name="normal" offset="2 2 40 2"/>
@ -15,7 +15,6 @@
<BasisSkin type="SubSkin" offset="38 2 2 36" align= "ALIGN_RIGHT ALIGN_VSTRETCH"> <BasisSkin type="SubSkin" offset="38 2 2 36" align= "ALIGN_RIGHT ALIGN_VSTRETCH">
<State name="normal" offset="40 4 2 36"/> <State name="normal" offset="40 4 2 36"/>
</BasisSkin> </BasisSkin>
<!-- The interior of the box --> <!-- The interior of the box -->
<Child type="Widget" skin="BlackBG" offset="2 2 36 36" align="ALIGN_STRETCH" name="Client"/> <Child type="Widget" skin="BlackBG" offset="2 2 36 36" align="ALIGN_STRETCH" name="Client"/>
</Skin> </Skin>

@ -27,24 +27,19 @@
</Skin> </Skin>
<!-- Progress bar track, various colors --> <!-- Progress bar track, various colors -->
<Skin name = "MW_BarTrack_Red" size = "16 8" texture = "menu_bar_red.dds" > <Skin name = "MW_BarTrack_Red" size = "4 8" texture = "smallbars.png" >
<BasisSkin type="MainSkin" offset = "0 0 16 8" align = "ALIGN_STRETCH"> <BasisSkin type="MainSkin" offset = "0 0 4 8" align = "ALIGN_STRETCH">
<State name="normal" offset = "0 8 16 8"/> <State name="normal" offset = "0 0 4 8"/>
</BasisSkin> </BasisSkin>
</Skin> </Skin>
<Skin name = "MW_BarTrack_Green" size = "16 8" texture = "menu_bar_green.dds" > <Skin name = "MW_BarTrack_Green" size = "4 8" texture = "smallbars.png" >
<BasisSkin type="MainSkin" offset = "0 0 16 8" align = "ALIGN_STRETCH"> <BasisSkin type="MainSkin" offset = "0 0 4 8" align = "ALIGN_STRETCH">
<State name="normal" offset = "0 8 16 8"/> <State name="normal" offset = "0 16 4 8"/>
</BasisSkin> </BasisSkin>
</Skin> </Skin>
<Skin name = "MW_BarTrack_Blue" size = "16 8" texture = "menu_bar_blue.dds" > <Skin name = "MW_BarTrack_Blue" size = "4 8" texture = "smallbars.png" >
<BasisSkin type="MainSkin" offset = "0 0 16 8" align = "ALIGN_STRETCH"> <BasisSkin type="MainSkin" offset = "0 0 4 8" align = "ALIGN_STRETCH">
<State name="normal" offset = "0 8 16 8"/> <State name="normal" offset = "0 8 4 8"/>
</BasisSkin>
</Skin>
<Skin name = "MW_BarTrack_Gray" size = "16 8" texture = "menu_bar_gray.dds" >
<BasisSkin type="MainSkin" offset = "0 0 16 8" align = "ALIGN_STRETCH">
<State name="normal" offset = "0 8 16 8"/>
</BasisSkin> </BasisSkin>
</Skin> </Skin>
@ -74,12 +69,4 @@
<Child type="Widget" skin="BlackBG" offset = "2 2 60 8" align = "ALIGN_STRETCH" name="Client"/> <Child type="Widget" skin="BlackBG" offset = "2 2 60 8" align = "ALIGN_STRETCH" name="Client"/>
</Skin> </Skin>
<Skin name="MW_EnergyBar_Gray" size="64 12">
<Property key="TrackSkin" value = "MW_BarTrack_Gray" />
<Property key="TrackWidth" value = "1" />
<Child type="Widget" skin="MW_BarFrame" offset="0 0 64 12" align="ALIGN_STRETCH"/>
<Child type="Widget" skin="BlackBG" offset = "2 2 60 8" align = "ALIGN_STRETCH" name="Client"/>
</Skin>
</MyGUI> </MyGUI>

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<MyGUI type="Layout">
<!-- The entire screen -->
<Widget type="Widget" layer="MainMenu" position="0 0 300 300" name="_Main">
<!-- Centered box containing the buttons -->
<Widget type="Widget" position="86 12 128 276" align="Center">
<!-- Menu boxes -->
<Widget type="Button" skin="ReturnButton" position="0 0 128 64" align="Top Left" name="Return"/>
<Widget type="Button" skin="NewButton" position="0 46 128 64" align="Top Left" name="New"/>
<Widget type="Button" skin="SaveButton" position="0 92 128 64" align="Top Left" name="Save"/>
<Widget type="Button" skin="LoadButton" position="0 138 128 64" align="Top Left" name="Load"/>
<Widget type="Button" skin="OptionsButton" position="0 184 128 64" align="Top Left" name="Options"/>
<Widget type="Button" skin="ExitButton" position="0 230 128 64" align="Top Left" name="Exit"/>
</Widget>
</Widget>
</MyGUI>

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<MyGUI type="Skin">
<Skin name="ReturnButton" size="128 64" texture="menu_return.dds">
<BasisSkin type="MainSkin" offset = "0 0 128 64">
<State name="normal" offset = "0 0 128 64"/>
</BasisSkin>
</Skin>
<Skin name="NewButton" size="128 64" texture="menu_newgame.dds">
<BasisSkin type="MainSkin" offset = "0 0 128 64">
<State name="normal" offset = "0 0 128 64"/>
</BasisSkin>
</Skin>
<Skin name="SaveButton" size="128 64" texture="menu_savegame.dds">
<BasisSkin type="MainSkin" offset = "0 0 128 64">
<State name="normal" offset = "0 0 128 64"/>
</BasisSkin>
</Skin>
<Skin name="LoadButton" size="128 64" texture="menu_loadgame.dds">
<BasisSkin type="MainSkin" offset = "0 0 128 64">
<State name="normal" offset = "0 0 128 64"/>
</BasisSkin>
</Skin>
<Skin name="OptionsButton" size="128 64" texture="menu_options.dds">
<BasisSkin type="MainSkin" offset = "0 0 128 64">
<State name="normal" offset = "0 0 128 64"/>
</BasisSkin>
</Skin>
<Skin name="ExitButton" size="128 64" texture="menu_exitgame.dds">
<BasisSkin type="MainSkin" offset = "0 0 128 64">
<State name="normal" offset = "0 0 128 64"/>
</BasisSkin>
</Skin>
</MyGUI>

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<MyGUI type="Layout">
<Widget type="Window" skin="MW_Window" layer="Windows" position="0 0 300 300" name="_Main">
<Widget type="StaticImage" skin="StaticImage" position="0 0 284 264" align="ALIGN_STRETCH" name="Map"/>
<Widget type="StaticImage" skin="StaticImage" position="126 116 32 32" align="Center" name="Compass"/>
<Widget type="Button" skin="MW_Button" position="213 233 61 22" align="ALIGN_BOTTOM ALIGN_RIGHT" name="WorldButton"/>
</Widget>
</MyGUI>

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<MyGUI type="Skin">
<!-- Progress bar track, various colors -->
<Skin name = "MW_BigTrack_Red" size = "2 14" texture = "bigbars.png" >
<BasisSkin type="MainSkin" offset = "0 0 2 14" align = "ALIGN_STRETCH">
<State name="normal" offset = "0 0 2 14"/>
</BasisSkin>
</Skin>
<Skin name = "MW_BigTrack_Green" size = "2 14" texture = "bigbars.png" >
<BasisSkin type="MainSkin" offset = "0 0 2 14" align = "ALIGN_STRETCH">
<State name="normal" offset = "0 14 2 14"/>
</BasisSkin>
</Skin>
<Skin name = "MW_BigTrack_Blue" size = "2 14" texture = "bigbars.png" >
<BasisSkin type="MainSkin" offset = "0 0 2 14" align = "ALIGN_STRETCH">
<State name="normal" offset = "0 28 2 14"/>
</BasisSkin>
</Skin>
<Skin name = "ProgressText" size = "16 16">
<Property key="FontName" value = "MyGUI_CoreFont.18" />
<Property key="FontHeight" value = "18" />
<Property key="AlignText" value = "ALIGN_CENTER" />
<Property key="Colour" value = "0.35 0.6 0.75" />
<BasisSkin type="SimpleText" offset = "0 0 16 16" align = "ALIGN_STRETCH"/>
</Skin>
<!-- Main energy bar widget definitions. There's one for each color.-->
<Skin name="MW_Progress_Red" size="64 12">
<Property key="TrackSkin" value = "MW_BigTrack_Red" />
<Property key="TrackWidth" value = "1" />
<Child type="Widget" skin="MW_Box" offset="0 0 64 12" align="ALIGN_STRETCH"/>
<Child type="Widget" skin="BlackBG" offset = "2 2 60 8" align = "ALIGN_STRETCH" name="Client"/>
</Skin>
<Skin name="MW_Progress_Green" size="64 12">
<Property key="TrackSkin" value = "MW_BigTrack_Green" />
<Property key="TrackWidth" value = "1" />
<Child type="Widget" skin="MW_Box" offset="0 0 64 12" align="ALIGN_STRETCH"/>
<Child type="Widget" skin="BlackBG" offset = "2 2 60 8" align = "ALIGN_STRETCH" name="Client"/>
</Skin>
<Skin name="MW_Progress_Blue" size="64 12">
<Property key="TrackSkin" value = "MW_BigTrack_Blue" />
<Property key="TrackWidth" value = "1" />
<Child type="Widget" skin="MW_Box" offset="0 0 64 12" align="ALIGN_STRETCH"/>
<Child type="Widget" skin="BlackBG" offset = "2 2 60 8" align = "ALIGN_STRETCH" name="Client"/>
</Skin>
</MyGUI>

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<MyGUI type="Layout">
<Widget type="Window" skin="MW_Window" layer="Windows" position="0 0 500 342" name="_Main">
<!-- Player health stats -->
<Widget type="Widget" skin="MW_Box" position="8 8 212 62">
<Widget type="StaticText" skin="NormalText" position="4 4 70 18" name="Health_str"/>
<Widget type="StaticText" skin="NormalText" position="4 22 70 18" name="Magicka_str"/>
<Widget type="StaticText" skin="NormalText" position="4 40 70 18" name="Fatigue_str"/>
<Widget type="Progress" skin="MW_Progress_Red" position="78 4 130 18" name="HBar"/>
<Widget type="Progress" skin="MW_Progress_Blue" position="78 22 130 18" name="MBar"/>
<Widget type="Progress" skin="MW_Progress_Green" position="78 40 130 18" name="FBar"/>
<Widget type="StaticText" skin="ProgressText" position="78 4 130 18" align="Center" name="HBarT"/>
<Widget type="StaticText" skin="ProgressText" position="78 22 130 18" align="Center" name="MBarT"/>
<Widget type="StaticText" skin="ProgressText" position="78 40 130 18" align="Center" name="FBarT"/>
</Widget>
<!-- Player level, race and class -->
<Widget type="Widget" skin="MW_Box" position="8 78 212 62">
<Widget type="StaticText" skin="NormalText" position="4 4 100 18" name="Level_str"/>
<Widget type="StaticText" skin="NormalText" position="4 22 100 18" name="Race_str"/>
<Widget type="StaticText" skin="NormalText" position="4 40 100 18" name="Class_str"/>
<Widget type="StaticText" skin="SandTextRight" position="104 4 104 18" name="LevelText"/>
<Widget type="StaticText" skin="SandTextRight" position="104 22 104 18" name="RaceText"/>
<Widget type="StaticText" skin="SandTextRight" position="104 40 104 18" name="ClassText"/>
</Widget>
<Widget type="Widget" skin="MW_Box" position="8 148 212 152">
<Widget type="StaticText" skin="SandText" position="4 4 100 18" name="Attrib1"/>
<Widget type="StaticText" skin="SandTextRight" position="104 4 104 18" name="AttribVal1"/>
<Widget type="StaticText" skin="SandText" position="4 22 100 18" name="Attrib2"/>
<Widget type="StaticText" skin="SandTextRight" position="104 22 104 18" name="AttribVal2"/>
<Widget type="StaticText" skin="SandText" position="4 40 100 18" name="Attrib3"/>
<Widget type="StaticText" skin="SandTextRight" position="104 40 104 18" name="AttribVal3"/>
<Widget type="StaticText" skin="SandText" position="4 58 100 18" name="Attrib4"/>
<Widget type="StaticText" skin="SandTextRight" position="104 58 104 18" name="AttribVal4"/>
<Widget type="StaticText" skin="SandText" position="4 76 100 18" name="Attrib5"/>
<Widget type="StaticText" skin="SandTextRight" position="104 76 104 18" name="AttribVal5"/>
<Widget type="StaticText" skin="SandText" position="4 94 100 18" name="Attrib6"/>
<Widget type="StaticText" skin="SandTextRight" position="104 94 104 18" name="AttribVal6"/>
<Widget type="StaticText" skin="SandText" position="4 112 100 18" name="Attrib7"/>
<Widget type="StaticText" skin="SandTextRight" position="104 112 104 18" name="AttribVal7"/>
<Widget type="StaticText" skin="SandText" position="4 130 100 18" name="Attrib8"/>
<Widget type="StaticText" skin="SandTextRight" position="104 130 104 18" name="AttribVal8"/>
</Widget>
<Widget type="Widget" skin="MW_Box" position="228 8 248 292" align="ALIGN_LEFT ALIGN_VSTRETCH">
</Widget>
</Widget>
</MyGUI>

@ -1,17 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<MyGUI type="Skin"> <MyGUI type="Skin">
<Skin name = "DaedricText" size = "16 16"> <Skin name = "NormalText" size = "16 16">
<Property key="FontName" value = "daedric" /> <Property key="FontName" value = "MyGUI_CoreFont.18" />
<Property key="FontHeight" value = "18" />
<Property key="AlignText" value = "ALIGN_LEFT ALIGN_BOTTOM" />
<Property key="Colour" value = "0.62 0.78 0.87" />
<BasisSkin type="SimpleText" offset = "0 0 16 16" align = "ALIGN_STRETCH"/>
</Skin>
<Skin name = "SandText" size = "16 16">
<Property key="FontName" value = "MyGUI_CoreFont.18" />
<Property key="FontHeight" value = "18" /> <Property key="FontHeight" value = "18" />
<Property key="AlignText" value = "ALIGN_LEFT ALIGN_BOTTOM" />
<Property key="Colour" value = "0.35 0.6 0.75" />
<BasisSkin type="SimpleText" offset = "0 0 16 16" align = "ALIGN_STRETCH"/>
</Skin>
<Skin name = "SandTextRight" size = "16 16">
<Property key="FontName" value = "MyGUI_CoreFont.18" />
<Property key="FontHeight" value = "18" />
<Property key="AlignText" value = "ALIGN_RIGHT ALIGN_BOTTOM" />
<Property key="Colour" value = "0.35 0.6 0.75" />
<BasisSkin type="SimpleText" offset = "0 0 16 16" align = "ALIGN_STRETCH"/>
</Skin>
<Skin name = "DaedricText" size = "16 16">
<Property key="FontName" value = "daedric36" />
<Property key="FontHeight" value = "36" />
<Property key="AlignText" value = "ALIGN_DEFAULT" /> <Property key="AlignText" value = "ALIGN_DEFAULT" />
<Property key="Colour" value = "1 1 1" /> <Property key="Colour" value = "1 1 1" />
<BasisSkin type="SimpleText" offset = "0 0 16 16" align = "ALIGN_STRETCH"/> <BasisSkin type="SimpleText" offset = "0 0 16 16" align = "ALIGN_STRETCH"/>
</Skin> </Skin>
<Skin name = "DaedricText_orig" size = "16 16"> <Skin name = "DaedricText_orig" size = "16 16">
<Property key="FontName" value = "daedric_orig" /> <Property key="FontName" value = "daedric_orig36" />
<Property key="FontHeight" value = "18" /> <Property key="FontHeight" value = "36" />
<Property key="AlignText" value = "ALIGN_DEFAULT" /> <Property key="AlignText" value = "ALIGN_DEFAULT" />
<Property key="Colour" value = "1 1 1" /> <Property key="Colour" value = "1 1 1" />
<BasisSkin type="SimpleText" offset = "0 0 16 16" align = "ALIGN_STRETCH"/> <BasisSkin type="SimpleText" offset = "0 0 16 16" align = "ALIGN_STRETCH"/>

@ -2,7 +2,7 @@
<MyGUI type="Skin"> <MyGUI type="Skin">
<!-- Defines a pure black background --> <!-- Defines a pure black background -->
<Skin name = "BlackBG" size = "8 8" texture = "black.png"> <Skin name = "BlackBG" size = "8 8" texture = "transparent.png">
<BasisSkin type="MainSkin" offset = "0 0 8 8"> <BasisSkin type="MainSkin" offset = "0 0 8 8">
<State name="normal" offset = "0 0 8 8"/> <State name="normal" offset = "0 0 8 8"/>
</BasisSkin> </BasisSkin>
@ -63,49 +63,6 @@
</BasisSkin> </BasisSkin>
</Skin> </Skin>
<!-- Inner borders -->
<Skin name="IB_T" size="512 2" texture="menu_thin_border_top.dds">
<BasisSkin type="MainSkin" offset = "0 0 512 2">
<State name="normal" offset = "0 0 512 2"/>
</BasisSkin>
</Skin>
<Skin name="IB_B" size="512 2" texture="menu_thin_border_bottom.dds">
<BasisSkin type="MainSkin" offset = "0 0 512 2">
<State name="normal" offset = "0 0 512 2"/>
</BasisSkin>
</Skin>
<Skin name="IB_L" size="2 512" texture="menu_thin_border_left.dds">
<BasisSkin type="MainSkin" offset = "0 0 2 512">
<State name="normal" offset = "0 0 2 512"/>
</BasisSkin>
</Skin>
<Skin name="IB_R" size="2 512" texture="menu_thin_border_right.dds">
<BasisSkin type="MainSkin" offset = "0 0 2 512">
<State name="normal" offset = "0 0 2 512"/>
</BasisSkin>
</Skin>
<Skin name="IB_TL" size="2 2" texture="menu_thin_border_top_left_corner.dds">
<BasisSkin type="MainSkin" offset = "0 0 2 2">
<State name="normal" offset = "0 0 2 2"/>
</BasisSkin>
</Skin>
<Skin name="IB_TR" size="2 2" texture="menu_thin_border_top_right_corner.dds">
<BasisSkin type="MainSkin" offset = "0 0 2 2">
<State name="normal" offset = "0 0 2 2"/>
</BasisSkin>
</Skin>
<Skin name="IB_BL" size="2 2" texture="menu_thin_border_bottom_left_corner.dds">
<BasisSkin type="MainSkin" offset = "0 0 2 2">
<State name="normal" offset = "0 0 2 2"/>
</BasisSkin>
</Skin>
<Skin name="IB_BR" size="2 2" texture="menu_thin_border_bottom_right_corner.dds">
<BasisSkin type="MainSkin" offset = "0 0 2 2">
<State name="normal" offset = "0 0 2 2"/>
</BasisSkin>
</Skin>
<!-- These parts defines the 'blocks' to the left and right of the caption --> <!-- These parts defines the 'blocks' to the left and right of the caption -->
<Skin name="HB_MID" size="256 16" texture="menu_head_block_middle.dds"> <Skin name="HB_MID" size="256 16" texture="menu_head_block_middle.dds">
<BasisSkin type="MainSkin" offset = "0 0 256 16"> <BasisSkin type="MainSkin" offset = "0 0 256 16">
@ -213,7 +170,7 @@
<Property key="Colour" value = "0.8 0.8 0.8" /> <Property key="Colour" value = "0.8 0.8 0.8" />
<Property key="ToStick" value = "true" /> <Property key="ToStick" value = "true" />
<Child type="Widget" skin="BlackBG" offset = "6 26 244 22" align = "ALIGN_STRETCH" name = "Client"/> <Child type="Widget" skin="BlackBG" offset = "8 28 240 18" align = "ALIGN_STRETCH" name = "Client"/>
<!-- Outer orders --> <!-- Outer orders -->
<Child type="Widget" skin="TB_T" offset="4 0 248 4" align="ALIGN_TOP ALIGN_HSTRETCH" name="Action"> <Child type="Widget" skin="TB_T" offset="4 0 248 4" align="ALIGN_TOP ALIGN_HSTRETCH" name="Action">
@ -243,14 +200,30 @@
</Child> </Child>
<!-- Inner borders --> <!-- Inner borders -->
<Child type="Widget" skin="IB_T" offset="6 24 244 2" align="ALIGN_TOP ALIGN_HSTRETCH"/> <Child type="Widget" skin="TB_T" offset="8 24 240 4" align="ALIGN_TOP ALIGN_HSTRETCH" name="Action">
<Child type="Widget" skin="IB_B" offset="6 48 244 2" align="ALIGN_BOTTOM ALIGN_HSTRETCH"/> <Property key="Scale" value = "0 1 0 -1"/>
<Child type="Widget" skin="IB_L" offset="4 26 2 22" align="ALIGN_LEFT ALIGN_VSTRETCH"/> </Child>
<Child type="Widget" skin="IB_R" offset="250 26 2 22" align="ALIGN_RIGHT ALIGN_VSTRETCH"/> <Child type="Widget" skin="TB_L" offset="4 28 4 18" align="ALIGN_LEFT ALIGN_VSTRETCH" name="Action">
<Child type="Widget" skin="IB_TL" offset="4 24 2 2" align="ALIGN_TOP ALIGN_LEFT"/> <Property key="Scale" value = "1 0 -1 0"/>
<Child type="Widget" skin="IB_TR" offset="250 24 2 2" align="ALIGN_TOP ALIGN_RIGHT"/> </Child>
<Child type="Widget" skin="IB_BL" offset="4 48 2 2" align="ALIGN_BOTTOM ALIGN_LEFT"/> <Child type="Widget" skin="TB_B" offset="8 46 240 4" align="ALIGN_BOTTOM ALIGN_HSTRETCH" name="Action">
<Child type="Widget" skin="IB_BR" offset="250 48 2 2" align="ALIGN_BOTTOM ALIGN_RIGHT"/> <Property key="Scale" value = "0 0 0 1"/>
</Child>
<Child type="Widget" skin="TB_R" offset="248 28 4 18" align="ALIGN_RIGHT ALIGN_VSTRETCH" name="Action">
<Property key="Scale" value = "0 0 1 0"/>
</Child>
<Child type="Widget" skin="TB_BR" offset="248 46 4 4" align="ALIGN_BOTTOM ALIGN_RIGHT" name="Action">
<Property key="Scale" value = "0 0 1 1"/>
</Child>
<Child type="Widget" skin="TB_BL" offset="4 46 4 4" align="ALIGN_BOTTOM ALIGN_LEFT" name="Action">
<Property key="Scale" value = "1 0 -1 1"/>
</Child>
<Child type="Widget" skin="TB_TR" offset="248 24 4 4" align="ALIGN_TOP ALIGN_RIGHT" name="Action">
<Property key="Scale" value = "0 1 1 -1"/>
</Child>
<Child type="Widget" skin="TB_TL" offset="4 24 4 4" align="ALIGN_TOP ALIGN_LEFT" name="Action">
<Property key="Scale" value = "1 1 -1 -1"/>
</Child>
<!-- Caption --> <!-- Caption -->
<Child type="Widget" skin="HB_ALL" offset="4 4 248 20" align = "ALIGN_TOP ALIGN_HSTRETCH"> <Child type="Widget" skin="HB_ALL" offset="4 4 248 20" align = "ALIGN_TOP ALIGN_HSTRETCH">

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/
@ -811,32 +811,17 @@ class LiteralExpr : Expression
return; return;
} }
bool hasPercent()
{
int i = value.str.find('%');
if(i == -1) return false;
// Make sure it is at the end
if(i != value.str.length-1)
fail("Number literals can only have a percentage sign (%) at the end. Perhaps you meant the reminder operator '%%' ?", value.loc);
return true;
}
// Numeric literal. // Numeric literal.
if(value.type == TT.NumberLiteral) if(value.type == TT.NumberLiteral)
{ {
// Parse number strings. Simple hack for now, assume it's an // Parse number strings. Simple hack for now, assume it's an
// int unless it contains a period, then it's a float. TODO: // int unless it contains a period, then it's a float. TODO:
// Improve this later, see how it is done elsewhere. // Improve this later, see how it is done elsewhere.
if(value.str.find('.') != -1 || hasPercent()) if(value.str.find('.') != -1)
{ {
type = BasicType.getFloat; type = BasicType.getFloat;
fval = atof(value.str); fval = atof(value.str);
if(hasPercent())
fval /= 100;
return; return;
} }

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/
@ -43,7 +43,7 @@ bool validIdentChar(char c)
} }
// Same as above, except numbers are not allowed as the first // Same as above, except numbers are not allowed as the first
// character. Will extend to support UTF8 later. // character. Will extend to support full Unicode later.
bool validFirstIdentChar(char c) bool validFirstIdentChar(char c)
{ {
if((c >= 'a' && c <= 'z') || if((c >= 'a' && c <= 'z') ||
@ -104,7 +104,7 @@ enum TT
Import, Clone, Override, Final, Function, With, Import, Clone, Override, Final, Function, With,
This, New, Static, Const, Out, Ref, Abstract, Idle, This, New, Static, Const, Out, Ref, Abstract, Idle,
Public, Private, Protected, True, False, Native, Null, Public, Private, Protected, True, False, Native, Null,
Goto, Var, In, Goto, Var,
Last, // Tokens after this do not have a specific string Last, // Tokens after this do not have a specific string
// associated with them. // associated with them.
@ -247,7 +247,6 @@ const char[][] tokenList =
TT.Null : "null", TT.Null : "null",
TT.Goto : "goto", TT.Goto : "goto",
TT.Var : "var", TT.Var : "var",
TT.In : "in",
// These are only used in error messages // These are only used in error messages
TT.StringLiteral : "string literal", TT.StringLiteral : "string literal",
@ -540,10 +539,6 @@ class StreamTokenizer
// also explicitly allow '.' dots. // also explicitly allow '.' dots.
int len = 1; int len = 1;
bool lastDot = false; // Was the last char a '.'? bool lastDot = false; // Was the last char a '.'?
// I've tried with percentage literals (10% = 0.10), but it
// conflicts with the remainder division operator (which
// shouldn't change), so I've disabled it for now.
//bool lastPer = false; // Was it a '%'?
foreach(char ch; line[1..$]) foreach(char ch; line[1..$])
{ {
if(ch == '.') if(ch == '.')
@ -557,19 +552,6 @@ class StreamTokenizer
} }
lastDot = true; lastDot = true;
} }
/*
else if(ch == '%')
{
// Ditto for percentage signs. We allow '%' but not
// '%%'
if(lastPer)
{
len--;
break;
}
lastPer = true;
}
*/
else else
{ {
if(!validIdentChar(ch)) break; if(!validIdentChar(ch)) break;

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,31 @@
/*
Monster - an advanced game scripting language
Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/
This file (all.d) is part of the Monster script language
package.
Monster is distributed as free software: you can redistribute it
and/or modify it under the terms of the GNU General Public License
version 3, as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
http://www.gnu.org/licenses/ .
*/
module monster.modules.all; module monster.modules.all;
import monster.modules.io; import monster.modules.io;
import monster.modules.math;
import monster.modules.timer; import monster.modules.timer;
import monster.modules.frames; import monster.modules.frames;
import monster.modules.random; import monster.modules.random;
@ -13,4 +38,5 @@ void initAllModules()
initFramesModule(); initFramesModule();
initThreadModule(); initThreadModule();
initRandomModule(); initRandomModule();
initMathModule();
} }

@ -1,3 +1,27 @@
/*
Monster - an advanced game scripting language
Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/
This file (frames.d) is part of the Monster script language
package.
Monster is distributed as free software: you can redistribute it
and/or modify it under the terms of the GNU General Public License
version 3, as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
http://www.gnu.org/licenses/ .
*/
// Provides some simple numbers and functions regarding the rendering // Provides some simple numbers and functions regarding the rendering
// frames of the application. It's up to the user to some degree to // frames of the application. It's up to the user to some degree to

@ -1,9 +1,32 @@
/*
Monster - an advanced game scripting language
Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/
This file (io.d) is part of the Monster script language
package.
Monster is distributed as free software: you can redistribute it
and/or modify it under the terms of the GNU General Public License
version 3, as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
http://www.gnu.org/licenses/ .
*/
// This module provides simple output functions for Monster. The 'i' // This module provides simple output functions for Monster. The 'i'
// part (input) isn't really there yet. // (input) part of 'io' isn't really there yet.
module monster.modules.io; module monster.modules.io;
import std.stdio;
import monster.monster; import monster.monster;
const char[] moduleDef = const char[] moduleDef =
@ -16,6 +39,29 @@ native writelns(char[][] args...);
native print(char[][] args...); native print(char[][] args...);
"; //" "; //"
// Use tango library functions directly, since flushing the
// minibos-versions will give weird effects when mixing with other
// tango output.
version(Tango)
{
import tango.io.Stdout;
void doWrite(bool space)
{
AIndex[] args = stack.popAArray();
char[] form = "{}";
if(space) form = "{} ";
foreach(AIndex ind; args)
Stdout.format(form, arrays.getRef(ind).carr);
Stdout.flush();
}
void writefln() { Stdout.newline; }
}
else
{ // Phobos
import std.stdio;
void doWrite(bool space) void doWrite(bool space)
{ {
AIndex[] args = stack.popAArray(); AIndex[] args = stack.popAArray();
@ -28,7 +74,7 @@ void doWrite(bool space)
fflush(stdout); fflush(stdout);
} }
}
void initIOModule() void initIOModule()
{ {
static MonsterClass mc; static MonsterClass mc;

@ -5,8 +5,13 @@
module io; module io;
// Write to console, with or without a newline
native write(char[][] args...); native write(char[][] args...);
native writeln(char[][] args...); native writeln(char[][] args...);
// Automatically inserts spaces between arguments
native writes(char[][] args...); native writes(char[][] args...);
native writelns(char[][] args...); native writelns(char[][] args...);
// Identical to writelns
native print(char[][] args...); native print(char[][] args...);

@ -0,0 +1,165 @@
/*
Monster - an advanced game scripting language
Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/
This file (math.d) is part of the Monster script language
package.
Monster is distributed as free software: you can redistribute it
and/or modify it under the terms of the GNU General Public License
version 3, as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
http://www.gnu.org/licenses/ .
*/
// Simple math functions
module monster.modules.math;
import monster.monster;
import std.math;
const char[] moduleDef =
"module math;
double E = 2.7182818284590452354;
double PI = 3.141592653589793238;
double DEGTORAD = 3.141592653590/180;
double RADTODEG = 180/3.141592653590;
native double sin(double x);
native double cos(double x);
native double tan(double x);
native double asin(double x);
native double acos(double x);
native double atan(double x);
native double atan2(double y, double x); // = atan(y/x)
native double sinh(double x);
native double cosh(double x);
native double tanh(double x);
native double asinh(double x);
native double acosh(double x);
native double atanh(double x);
native double sqrt(double x);
native double exp(double x); // e^x
native double exp2(double x); // 2^x
native double log(double x); // base e
native double log10(double x);// base 10
native double log2(double x); // base 2
native double pow(double x, double y); // x^y
native double ipow(double x, int n); // x^n (faster than pow)
native int abs(int x);
native double fabs(double x);
native double ceil(double x);
native double floor(double x);
native double round(double x); // rounds to nearest integer
native double trunc(double x);
native double hypot(double x, double y); // = sqrt(x*x+y*y)
native double cbrt(double x); // cube root
// Calculates polynomial a0 + x*a1 + x^2*a2 + x^3*a3 + ...
native double poly(double x, float[] A);
"; //"
version(Tango)
{
double fabs(double x) { return abs(x); }
}
void initMathModule()
{
static MonsterClass mc;
if(mc !is null) return;
mc = new MonsterClass(MC.String, moduleDef, "math");
mc.bind("sin", { stack.pushDouble(sin(stack.popDouble)); });
mc.bind("cos", { stack.pushDouble(cos(stack.popDouble)); });
mc.bind("tan", { stack.pushDouble(tan(stack.popDouble)); });
mc.bind("asin", { stack.pushDouble(asin(stack.popDouble)); });
mc.bind("acos", { stack.pushDouble(acos(stack.popDouble)); });
mc.bind("atan", { stack.pushDouble(atan(stack.popDouble)); });
mc.bind("sinh", { stack.pushDouble(sinh(stack.popDouble)); });
mc.bind("cosh", { stack.pushDouble(cosh(stack.popDouble)); });
mc.bind("tanh", { stack.pushDouble(tanh(stack.popDouble)); });
mc.bind("asinh", { stack.pushDouble(asinh(stack.popDouble)); });
mc.bind("acosh", { stack.pushDouble(acosh(stack.popDouble)); });
mc.bind("atanh", { stack.pushDouble(atanh(stack.popDouble)); });
mc.bind("atan2",
{
// Remember to pop the variables in the reverse order
auto x = stack.popDouble;
stack.pushDouble(atan2(stack.popDouble, x));
});
mc.bind("sqrt", { stack.pushDouble(sqrt(stack.popDouble)); });
mc.bind("exp", { stack.pushDouble(exp(stack.popDouble)); });
mc.bind("exp2", { stack.pushDouble(exp2(stack.popDouble)); });
mc.bind("log", { stack.pushDouble(log(stack.popDouble)); });
mc.bind("log2", { stack.pushDouble(log2(stack.popDouble)); });
mc.bind("log10", { stack.pushDouble(log10(stack.popDouble)); });
mc.bind("pow",
{
auto x = stack.popDouble;
stack.pushDouble(pow(stack.popDouble, x));
});
mc.bind("ipow",
{
auto x = stack.popInt;
stack.pushDouble(pow(cast(real)stack.popDouble, x));
});
mc.bind("abs", { stack.pushDouble(abs(stack.popDouble)); });
mc.bind("fabs", { stack.pushDouble(fabs(stack.popDouble)); });
mc.bind("ceil", { stack.pushDouble(ceil(stack.popDouble)); });
mc.bind("floor", { stack.pushDouble(floor(stack.popDouble)); });
mc.bind("round", { stack.pushDouble(round(stack.popDouble)); });
mc.bind("trunc", { stack.pushDouble(trunc(stack.popDouble)); });
// Order doesn't matter here
mc.bind("hypot", { stack.pushDouble(hypot(stack.popDouble,
stack.popDouble)); });
mc.bind("cbrt", { stack.pushDouble(cbrt(stack.popDouble)); });
mc.bind("poly", &npoly);
}
// Implement this ourselves, since phobos doesn't use the types we
// want
double poly(double x, float A[])
{
// Use 'real' internally for higher precision
real r = A[$-1];
foreach_reverse(c; A[0..$-1])
{
r *= x;
r += c;
}
return r;
}
// double poly(double x, float[] A);
void npoly()
{
auto arf = stack.popArray();
assert(arf.elemSize == 1);
stack.pushDouble(poly(stack.popDouble, arf.farr));
}

@ -0,0 +1,43 @@
module math;
double E = 2.7182818284590452354;
double PI = 3.141592653589793238;
double DEGTORAD = 3.141592653590/180;
double RADTODEG = 180/3.141592653590;
native double sin(double x);
native double cos(double x);
native double tan(double x);
native double asin(double x);
native double acos(double x);
native double atan(double x);
native double atan2(double y, double x); // = atan(y/x)
native double sinh(double x);
native double cosh(double x);
native double tanh(double x);
native double asinh(double x);
native double acosh(double x);
native double atanh(double x);
native double sqrt(double x);
native double exp(double x); // e^x
native double exp2(double x); // 2^x
native double log(double x); // base e
native double log10(double x);// base 10
native double log2(double x); // base 2
native double pow(double x, double y); // x^y
native double ipow(double x, int n); // x^n (faster than pow)
native int abs(int x);
native double fabs(double x);
native double ceil(double x);
native double floor(double x);
native double round(double x); // rounds to nearest integer
native double trunc(double x);
native double hypot(double x, double y); // = sqrt(x*x+y*y)
native double cbrt(double x); // cube root
// Calculates polynomial a0 + x*a1 + x^2*a2 + x^3*a3 + ...
native double poly(double x, float[] A);

@ -1,3 +1,25 @@
/*
Monster - an advanced game scripting language
Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/
This file (random.d) is part of the Monster script language package.
Monster is distributed as free software: you can redistribute it
and/or modify it under the terms of the GNU General Public License
version 3, as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
http://www.gnu.org/licenses/ .
*/
// This module provides simple random number generation. Since this is // This module provides simple random number generation. Since this is
// intended for game development, speed and simplicity is favored over // intended for game development, speed and simplicity is favored over

@ -1,3 +1,27 @@
/*
Monster - an advanced game scripting language
Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/
This file (threads.d) is part of the Monster script language
package.
Monster is distributed as free software: you can redistribute it
and/or modify it under the terms of the GNU General Public License
version 3, as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
http://www.gnu.org/licenses/ .
*/
// This module provides an interface to the virtual threading API in // This module provides an interface to the virtual threading API in
// Monster. // Monster.

@ -1,3 +1,27 @@
/*
Monster - an advanced game scripting language
Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/
This file (timer.d) is part of the Monster script language
package.
Monster is distributed as free software: you can redistribute it
and/or modify it under the terms of the GNU General Public License
version 3, as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
http://www.gnu.org/licenses/ .
*/
// This module contains (or will contain) various routines for // This module contains (or will contain) various routines for
// timing. It is also home of the ubiquitous "sleep" idle function. // timing. It is also home of the ubiquitous "sleep" idle function.

@ -4,4 +4,6 @@
*/ */
singleton timer; singleton timer;
// Sleep the given number of seconds
idle sleep(float secs); idle sleep(float secs);

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2004, 2007, 2008 Nicolay Korslund Copyright (C) 2004, 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/
@ -47,11 +47,11 @@ import monster.vm.iterators;
import monster.vm.error; import monster.vm.error;
import monster.vm.fstack; import monster.vm.fstack;
import std.math : floor;
// Used for array copy below. It handles overlapping data for us. // Used for array copy below. It handles overlapping data for us.
extern(C) void* memmove(void *dest, void *src, size_t n); extern(C) void* memmove(void *dest, void *src, size_t n);
extern(C) double floor(double d);
import monster.util.list; import monster.util.list;
alias _lstNode!(Thread) _tmp1; alias _lstNode!(Thread) _tmp1;
alias __FreeNode!(Thread) _tmp2; alias __FreeNode!(Thread) _tmp2;

@ -1,6 +1,6 @@
/* /*
Monster - an advanced game scripting language Monster - an advanced game scripting language
Copyright (C) 2007, 2008 Nicolay Korslund Copyright (C) 2007-2009 Nicolay Korslund
Email: <korslund@gmail.com> Email: <korslund@gmail.com>
WWW: http://monster.snaptoad.com/ WWW: http://monster.snaptoad.com/

@ -1,38 +1,36 @@
// Small script that prints the FPS to screen with regular intervals. // Small script that prints the FPS to screen with regular intervals.
class FPSTicker;
import frames; import frames;
// Set the FPS widget text // Set up the text widget
native setText(char[][] args...); Widget txt = gui.text("StaticText",
gui.getWidth()-90, 10, 120, 30,
run() "Statistic");
{ txt.setNeedMouseFocus(false);
// Sleep one frame. This makes sure that we won't start running until txt.setTextColor(1,1,1);
// the rendering begins. Not critically important, but it prevents the txt.setCaption("hello!");
// first printed value from being 'nan'.
fsleep(1);
setText("hello!"); // Sleep one frame. This makes sure we only start running after
// rendering begins. It prevents the first printed value from being
// 'nan'
fsleep(1);
// counter and totalTime (in the 'frames' module) are updated // counter and totalTime (in the 'frames' module) are updated
// automatically by the system. // automatically by the system.
ulong lastFrame = counter; ulong lastFrame = counter;
float lastTime = totalTime; float lastTime = totalTime;
float delay = 1.5; float delay = 1.5;
while(true) while(true)
{ {
sleep(delay); sleep(delay);
// Calculate differences since last frame // Calculate differences since last frame
ulong fdiff = counter-lastFrame; ulong fdiff = counter-lastFrame;
float tdiff = totalTime-lastTime; float tdiff = totalTime-lastTime;
setText("fps: ", fdiff / tdiff); txt.setCaption("fps: ", fdiff/tdiff);
lastFrame = counter; lastFrame = counter;
lastTime = totalTime; lastTime = totalTime;
}
} }

@ -0,0 +1,5 @@
/*
Widget hud;
hud = gui.loadLayout("openmw_hud_layout.xml");
hud.setCoord(10,10,500,500);
*/

@ -0,0 +1,11 @@
// GUI module. Only covers some very basic functions.
module gui;
// Later, we'll have singleton gui : Widget; with most of the
// functions defined in Widget.
native Widget loadLayout(char[] file);
native Widget text(char[] skin, int x, int y, int w, int h,
char[] layer);
native int getWidth();
native int getHeight();

@ -0,0 +1,10 @@
class Widget;
native setNeedMouseFocus(bool b);
native setTextColor(float r, float g, float b);
native setCoord(int x, int y, int w, int h);
native setCaption(char[][] str...);
// Find a named child widget
native Widget get(char[] name);

@ -28,7 +28,7 @@ import monster.compiler.scopes : global;
import monster.modules.timer; import monster.modules.timer;
import core.config; import core.config;
import ogre.bindings; import ogre.gui;
import std.string; import std.string;
@ -50,24 +50,20 @@ void initMonsterScripts()
// Get the Config singleton object // Get the Config singleton object
config.mo = (new MonsterClass("Config")).getSing(); config.mo = (new MonsterClass("Config")).getSing();
// Run the fps ticker // Set up the GUI Monster module
//vm.run("fpsticker.mn"); setupGUIScripts();
auto mc = new MonsterClass("fpsticker.mn");
mc.bind("setText", &setFpsText);
mc.createObject().call("run");
// Run the test script // Run the test script
vm.run("test.mn"); vm.run("test.mn");
} }
void setFpsText() // Run the GUI scripts. These should be run only after the
// GUI/rendering system has been initialized
void runGUIScripts()
{ {
AIndex[] args = stack.popAArray(); // Create the HUD and windows
vm.run("makegui.mn");
char[] res;
foreach(AIndex ind; args) // Run the fps ticker
res ~= format("%s", arrays.getRef(ind).carr); vm.run("fpsticker.mn");
gui_setFpsText(res.ptr);
} }

@ -163,7 +163,27 @@ void ogre_moveCameraRel(float x, float y, float z);
// Insert a raw RGBA image into the texture system. // Insert a raw RGBA image into the texture system.
//void ogre_insertTexture(char *name, int width, int height, void *data); //void ogre_insertTexture(char *name, int width, int height, void *data);
// Test // GUI functions. Under development.
typedef void* WidgetPtr;
void gui_setupGUI(); void gui_setupGUI();
void gui_toggleGui(); void gui_toggleGui();
void gui_setFpsText(char *str); void gui_setCellName(char *str);
// Get the widget type, as a string
char *gui_widgetType(WidgetPtr);
// Get the height or width of a widget. If the argument is null,
// return the size of the screen.
int gui_getHeight(WidgetPtr);
int gui_getWidth(WidgetPtr);
// Set various properties of a given widget
void gui_setCaption(WidgetPtr, char*);
void gui_setNeedMouseFocus(WidgetPtr, int);
void gui_setTextColor(WidgetPtr, float,float,float);
void gui_setCoord(WidgetPtr, int,int,int,int);
// Various ways to get or create widgets
WidgetPtr gui_loadLayout(char *file, char *prefix, WidgetPtr parent);
WidgetPtr gui_getChild(WidgetPtr, char*);
WidgetPtr gui_createText(char *skin, int x, int y, int w, int h, char *layer);

@ -1,37 +1,82 @@
MyGUI::WidgetPtr FPSText; // TODO: KILLME
char *cellName;
extern "C" void gui_setCellName(char *str)
{
cellName = str;
}
MyGUI::WindowPtr mwindow; // Get the widget type, as a string
extern "C" const char *gui_widgetType(MyGUI::WidgetPtr p)
{ return p->getTypeName().c_str(); }
OIS::MouseState state; extern "C" int32_t gui_getHeight(MyGUI::WidgetPtr p)
{
if(p == NULL) mWindow->getHeight();
return p->getHeight();
}
extern "C" void gui_toggleGui() extern "C" int32_t gui_getWidth(MyGUI::WidgetPtr p)
{ {
if(guiMode == 1) if(p == NULL) return mWindow->getWidth();
{ return p->getWidth();
guiMode = 0; }
mGUI->hidePointer();
if(mwindow)
mwindow->setVisible(false);
state = mMouse->getMouseState();
}
else
{
// Restore the GUI mouse position. This is a hack because silly
// OIS doesn't allow us to set the mouse position ourselves.
*((OIS::MouseState*)&(mMouse->getMouseState())) = state;
mGUI->injectMouseMove(state.X.abs, state.Y.abs, 0);
guiMode = 1; // Set various properties of a given widget
mGUI->showPointer(); extern "C" void gui_setCaption(MyGUI::WidgetPtr p, char* s)
if(mwindow) { p->setCaption(s); }
mwindow->setVisible(true);
} extern "C" void gui_setNeedMouseFocus(MyGUI::WidgetPtr p, int32_t b)
{ p->setNeedMouseFocus(b); }
extern "C" void gui_setTextColor(MyGUI::WidgetPtr p, float r,float g,float b)
{ p->setTextColour(Ogre::ColourValue(b,g,r)); }
extern "C" void gui_setCoord(MyGUI::WidgetPtr p,
int32_t x,int32_t y,int32_t w,int32_t h)
{ p->setCoord(x,y,w,h); }
// Various ways to get or create widgets
extern "C" MyGUI::WidgetPtr gui_loadLayout(char *file, char *prefix,
MyGUI::WidgetPtr parent)
{
// Get the list of Widgets in this layout
MyGUI::VectorWidgetPtr wlist;
wlist = MyGUI::LayoutManager::getInstance().
loadLayout(file, prefix, parent);
MyGUI::VectorWidgetPtr::iterator iter;
iter = wlist.begin();
// Return null if the list is empty
if(wlist.end() == iter)
return NULL;
MyGUI::WidgetPtr res = *iter;
++iter;
if(iter != wlist.end())
std::cout << "WARNING: Layout '" << file
<< "' has more than one root widget. Ignored.\n";
return res;
} }
void turnGuiOff(MyGUI::WidgetPtr sender) extern "C" MyGUI::WidgetPtr gui_getChild(MyGUI::WidgetPtr p, char* name)
{ {
guiMode = 1; return p->findWidget(name);
gui_toggleGui(); }
extern "C" MyGUI::WidgetPtr gui_createText(const char *skin,
int32_t x, int32_t y,
int32_t w, int32_t h,
const char *layer)
{
return mGUI->createWidget<MyGUI::StaticText>
(skin,
x,y,w,h,
MyGUI::ALIGN_LEFT | MyGUI::ALIGN_TOP,
layer);
} }
// Copied from MyGUI demo code, with a few modifications // Copied from MyGUI demo code, with a few modifications
@ -110,11 +155,37 @@ public:
mMainWidget->setCoord(x,y,w,h); mMainWidget->setCoord(x,y,w,h);
} }
void setVisible(bool b)
{
mMainWidget->setVisible(b);
}
virtual ~Layout() virtual ~Layout()
{ {
shutdown(); shutdown();
} }
void setText(const char* name, const char* caption)
{
MyGUI::WidgetPtr pt;
getWidget(pt, name);
pt->setCaption(caption);
}
void setColor(const char* name, float r, float g, float b)
{
MyGUI::WidgetPtr pt;
getWidget(pt, name);
pt->setTextColour(Ogre::ColourValue(b,g,r));
}
void setImage(const char* name, const char* imgName)
{
MyGUI::StaticImagePtr pt;
getWidget(pt, name);
pt->setImageTexture(imgName);
}
protected: protected:
MyGUI::WidgetPtr mMainWidget; MyGUI::WidgetPtr mMainWidget;
@ -197,7 +268,135 @@ public:
MyGUI::StaticImagePtr compass; MyGUI::StaticImagePtr compass;
}; };
class MapWindow : public Layout
{
public:
MapWindow()
: Layout("openmw_map_window_layout.xml")
{
setCoord(500,0,320,300);
mMainWidget->setCaption(cellName);
setText("WorldButton", "World");
setColor("WorldButton", 0.75, 0.6, 0.35);
setImage("Compass", "compass.dds");
}
};
class MainMenu : public Layout
{
public:
MainMenu()
: Layout("openmw_mainmenu_layout.xml")
{
setCoord(0,0,
mWindow->getWidth(),
mWindow->getHeight());
}
};
class StatsWindow : public Layout
{
public:
void setBar(const char* name, const char* tname, int val, int max)
{
MyGUI::ProgressPtr pt;
getWidget(pt, name);
pt->setProgressRange(max);
pt->setProgressPosition(val);
std::stringstream out;
out << val << "/" << max;
setText(tname, out.str().c_str());
}
StatsWindow()
: Layout("openmw_stats_window_layout.xml")
{
setCoord(0,0,498, 342);
mMainWidget->setCaption("Playername");
setText("Health_str", "Health");
setText("Magicka_str", "Magicka");
setText("Fatigue_str", "Fatigue");
setText("Level_str", "Level");
setText("Race_str", "Race");
setText("Class_str", "Class");
setText("LevelText", "5");
setText("RaceText", "Wood Elf");
setText("ClassText", "Pilgrim");
setBar("HBar", "HBarT", 60, 100);
setBar("MBar", "MBarT", 30, 100);
setBar("FBar", "FBarT", 80, 100);
setText("Attrib1", "Strength");
setText("Attrib2", "Intelligence");
setText("Attrib3", "Willpower");
setText("Attrib4", "Agility");
setText("Attrib5", "Speed");
setText("Attrib6", "Endurance");
setText("Attrib7", "Personality");
setText("Attrib8", "Luck");
setText("AttribVal1", "30");
setText("AttribVal2", "40");
setText("AttribVal3", "30");
setText("AttribVal4", "75");
setText("AttribVal5", "50");
setText("AttribVal6", "40");
setText("AttribVal7", "50");
setText("AttribVal8", "40");
}
};
HUD *hud; HUD *hud;
StatsWindow *stats;
MapWindow *map;
MyGUI::WidgetPtr FPSText;
MyGUI::WindowPtr mwindow;
OIS::MouseState state;
// KILLME
extern "C" void gui_toggleGui()
{
if(guiMode == 1)
{
guiMode = 0;
mGUI->hidePointer();
if(mwindow)
mwindow->setVisible(false);
if(stats)
stats->setVisible(false);
if(map)
map->setVisible(false);
state = mMouse->getMouseState();
}
else
{
// Restore the GUI mouse position. This is a hack because silly
// OIS doesn't allow us to set the mouse position ourselves.
*((OIS::MouseState*)&(mMouse->getMouseState())) = state;
mGUI->injectMouseMove(state.X.abs, state.Y.abs, 0);
guiMode = 1;
mGUI->showPointer();
if(mwindow)
mwindow->setVisible(true);
if(stats)
stats->setVisible(true);
if(map)
map->setVisible(true);
}
}
// KILLME
void turnGuiOff(MyGUI::WidgetPtr sender)
{
guiMode = 1;
gui_toggleGui();
}
extern "C" void gui_setupGUI() extern "C" void gui_setupGUI()
{ {
@ -209,29 +408,19 @@ extern "C" void gui_setupGUI()
int mWidth = mWindow->getWidth(); int mWidth = mWindow->getWidth();
int mHeight = mWindow->getHeight(); int mHeight = mWindow->getHeight();
int width = 120;
int height = 30;
// FPS Ticker
FPSText = mGUI->createWidget<MyGUI::Widget>
("StaticText",
mWidth - width -10, 10, // Position
width, height, // Size
MyGUI::ALIGN_RIGHT | MyGUI::ALIGN_TOP,
"Statistic");
FPSText->setTextAlign(MyGUI::ALIGN_RIGHT);
FPSText->setNeedMouseFocus(false);
FPSText->setTextColour(Ogre::ColourValue::White);
stats = new StatsWindow();
map = new MapWindow();
/*
// Window with Morrowind skin // Window with Morrowind skin
mwindow = mGUI->createWidget<MyGUI::Window> mwindow = mGUI->createWidget<MyGUI::Window>
("MW_Window", ("MW_Window",
(mWidth-width)/4, (mHeight-height)/4, // Position (mWidth-width)/2, (mHeight-height)/2, // Position
300, 190, // Size 400, 190, // Size
MyGUI::ALIGN_DEFAULT, "Windows"); MyGUI::ALIGN_DEFAULT, "Windows");
mwindow->setCaption("Skin test"); mwindow->setCaption("Skin test");
mwindow->setMinSize(120, 140); mwindow->setMinSize(120, 140);
mwindow->getClientWidget()->setAlpha(0.6);
MyGUI::WidgetPtr tmp; MyGUI::WidgetPtr tmp;
tmp = mwindow->createWidget<MyGUI::Button> tmp = mwindow->createWidget<MyGUI::Button>
@ -242,23 +431,23 @@ extern "C" void gui_setupGUI()
"MWButton1"); "MWButton1");
tmp->setCaption("Close"); tmp->setCaption("Close");
tmp->eventMouseButtonClick = MyGUI::newDelegate(&turnGuiOff); tmp->eventMouseButtonClick = MyGUI::newDelegate(&turnGuiOff);
tmp->setInheritsAlpha(false);
tmp = mwindow->createWidget<MyGUI::StaticText> tmp = mwindow->createWidget<MyGUI::StaticText>
("DaedricText_orig", ("DaedricText_orig",
10,70, 20,80,
300, 20, 500, 30,
MyGUI::ALIGN_LEFT | MyGUI::ALIGN_TOP, MyGUI::ALIGN_LEFT | MyGUI::ALIGN_TOP,
"Daed1"); "Daed1");
tmp->setCaption("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); tmp->setCaption("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
tmp = mwindow->createWidget<MyGUI::StaticText> tmp = mwindow->createWidget<MyGUI::StaticText>
("DaedricText", ("DaedricText",
10,100, 20,130,
300, 20, 500, 30,
MyGUI::ALIGN_LEFT | MyGUI::ALIGN_TOP, MyGUI::ALIGN_LEFT | MyGUI::ALIGN_TOP,
"Daed2"); "Daed2");
tmp->setCaption("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); tmp->setCaption("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
*/
// Turn the GUI off at startup // Turn the GUI off at startup
turnGuiOff(NULL); turnGuiOff(NULL);
@ -266,8 +455,7 @@ extern "C" void gui_setupGUI()
state.X.abs = mWidth / 2; state.X.abs = mWidth / 2;
state.Y.abs = mHeight / 2; state.Y.abs = mHeight / 2;
MyGUI::ProgressPtr prog; //*
// Set up the HUD // Set up the HUD
hud = new HUD(); hud = new HUD();
@ -281,10 +469,7 @@ extern "C" void gui_setupGUI()
hud->setSpellStatus(65, 100); hud->setSpellStatus(65, 100);
hud->setEffect("icons\\s\\tx_s_chameleon.dds"); hud->setEffect("icons\\s\\tx_s_chameleon.dds");
} //*/
extern "C" void gui_setFpsText(char *str) //new MainMenu();
{
if(FPSText != NULL)
FPSText->setCaption(str);
} }

@ -0,0 +1,255 @@
/*
OpenMW - The completely unofficial reimplementation of Morrowind
Copyright (C) 2008-2009 Nicolay Korslund
Email: < korslund@gmail.com >
WWW: http://openmw.snaptoad.com/
This file (gui.d) is part of the OpenMW package.
OpenMW is distributed as free software: you can redistribute it
and/or modify it under the terms of the GNU General Public License
version 3, as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
version 3 along with this program. If not, see
http://www.gnu.org/licenses/ .
*/
module ogre.gui;
import monster.monster;
import ogre.bindings;
import std.string;
// Widget class and gui module
MonsterClass
gmc, // GUI module
wid_mc, // Widget
but_mc, // Button
tex_mc, // StaticText
img_mc, // StaticImage
pro_mc, // Progress
win_mc; // Window
MWidget[WidgetPtr] gui_store;
class MWidget
{
WidgetPtr widget;
MonsterObject *mo;
// Used for layouts
bool isLayout;
char[] prefix;
// For layouts
this(char[] layout, WidgetPtr parent = null)
{
assert(layout.length);
isLayout = true;
prefix = format("%s", cast(void*)this);
widget = gui_loadLayout(layout.ptr, prefix.ptr, parent);
if(widget is null)
fail("Layout " ~ layout ~ " is empty");
this();
}
// For normal widgets
this(WidgetPtr w)
{
isLayout = false;
widget = w;
assert(widget !is null);
this();
}
private this()
{
assert(widget !is null);
// Create the object from the right class
mo = toClass(widget).createObject();
// But store the pointer in the Widget's pointer slot
mo.getExtra(wid_mc).obj = this;
// Also store a lookup for later
gui_store[widget] = this;
}
MWidget getChild(char[] name)
{
if(prefix.length)
name = prefix ~ name;
// Get the child widget
auto pt = gui_getChild(widget, name.ptr);
if(pt is null)
fail("Widget has no child named " ~ name);
// Return the MWidget
return get(pt);
}
// Return the MonsterClass corresponding to a given widget.
private static MonsterClass toClass(WidgetPtr p)
{
switch(widgetType(p))
{
/*
case "Button": return but_mc;
case "StaticText": return tex_mc;
case "StaticImage": return img_mc;
case "Progress": return pro_mc;
case "Window": return win_mc;
*/
default:
// Use "Widget" for all unimplemented types
case "Widget": return wid_mc;
}
}
// Get the MWidget (and associatied MonsterObject) corresponding to
// a given Widget.
static MWidget get(WidgetPtr wid)
{
// First, check if the instance exists
auto p = wid in gui_store;
if(p) return *p;
// No MWidget exists. We have to create one.
return new MWidget(wid);
}
};
char[] widgetType(WidgetPtr p)
{
return toString(gui_widgetType(p));
}
MWidget getMWOwner(MonsterObject *mo)
{
return (cast(MWidget)mo.getExtra(wid_mc).obj);
}
MWidget getMWOwner()
{
return getMWOwner(params.obj());
}
WidgetPtr getOwner(MonsterObject *mo)
{
return getMWOwner(mo).widget;
}
WidgetPtr getOwner()
{
return getMWOwner().widget;
}
// Widget functions
void setCaption()
{
AIndex[] args = stack.popAArray();
char[] res;
foreach(AIndex ind; args)
res ~= format("%s", arrays.getRef(ind).carr);
gui_setCaption(getOwner(), res.ptr);
}
void setNeedMouseFocus()
{ gui_setNeedMouseFocus(getOwner(), stack.popBool); }
void setTextColor()
{
float b = stack.popFloat();
float g = stack.popFloat();
float r = stack.popFloat();
gui_setTextColor(getOwner(), r,g,b);
}
void setCoord()
{
int h = stack.popInt();
int w = stack.popInt();
int y = stack.popInt();
int x = stack.popInt();
gui_setCoord(getOwner(), x,y,w,h);
}
void get()
{
// Get the owner MWidget
auto mw = getMWOwner();
// Get the child
mw = mw.getChild(stack.popString8());
// Push the object
stack.pushObject(mw.mo);
}
// TODO: These are all written to be used with the 'gui' module. Later
// they should be part of Widget, and create child widgets. When used
// with 'gui' they create root widgets.
void loadLayout()
{
MWidget mw = new MWidget(stack.popString8());
stack.pushObject(mw.mo);
}
void text()
{
char[] layer = stack.popString8();
int h = stack.popInt();
int w = stack.popInt();
int y = stack.popInt();
int x = stack.popInt();
char[] skin = stack.popString8();
WidgetPtr ptr = gui_createText(skin.ptr,
x,y,w,h,
layer.ptr);
assert(widgetType(ptr) == "StaticText");
MWidget mw = new MWidget(ptr);
stack.pushObject(mw.mo);
}
void getWidth()
{
stack.pushInt(gui_getWidth(null));
}
void getHeight()
{
stack.pushInt(gui_getHeight(null));
}
void setupGUIScripts()
{
vm.addPath("mscripts/gui/");
vm.addPath("mscripts/gui/module/");
gmc = new MonsterClass("gui", "gui.mn");
wid_mc = new MonsterClass("Widget", "widget.mn");
/*
but_mc = new MonsterClass("Button", "button.mn");
tex_mc = new MonsterClass("Text", "text.mn");
img_mc = new MonsterClass("Image", "image.mn");
pro_mc = new MonsterClass("Progress", "progress.mn");
win_mc = new MonsterClass("Window", "window.mn");
*/
wid_mc.bind("setCaption", &setCaption);
wid_mc.bind("setNeedMouseFocus", &setNeedMouseFocus);
wid_mc.bind("setTextColor", &setTextColor);
wid_mc.bind("setCoord", &setCoord);
wid_mc.bind("get", &get);
gmc.bind("text", &text);
gmc.bind("loadLayout", &loadLayout);
gmc.bind("getWidth", &getWidth);
gmc.bind("getHeight", &getHeight);
}

@ -1,6 +1,6 @@
/* /*
OpenMW - The completely unofficial reimplementation of Morrowind OpenMW - The completely unofficial reimplementation of Morrowind
Copyright (C) 2008 Nicolay Korslund Copyright (C) 2008-2009 Nicolay Korslund
Email: < korslund@gmail.com > Email: < korslund@gmail.com >
WWW: http://openmw.snaptoad.com/ WWW: http://openmw.snaptoad.com/
@ -27,6 +27,8 @@ import core.resource;
import core.config; import core.config;
import ogre.bindings; import ogre.bindings;
import mscripts.setup;
import bullet.bindings; import bullet.bindings;
import util.uniquename; import util.uniquename;
import std.stdio; import std.stdio;
@ -116,9 +118,12 @@ void setupOgre()
// exterior cells differently, etc. // exterior cells differently, etc.
ogre_makeScene(); ogre_makeScene();
// Load the GUI elements // Load the GUI system
gui_setupGUI(); gui_setupGUI();
// Run the GUI scripts
runGUIScripts();
ogreSetup = true; ogreSetup = true;
} }

@ -224,6 +224,10 @@ void main(char[][] args)
return null; return null;
} }
if(cd.inCell !is null)
// Set the name for the GUI (temporary hack)
gui_setCellName(cd.inCell.id.ptr);
if(render) if(render)
{ {
// Warm up OGRE // Warm up OGRE

Loading…
Cancel
Save