Modified Linux source. MODIFIED_LINUX
authorFlorian Schulze <crow@icculus.org>
Wed, 13 Feb 2002 15:52:05 +0000 (15:52 +0000)
committerFlorian Schulze <crow@icculus.org>
Wed, 13 Feb 2002 15:52:05 +0000 (15:52 +0000)
12 files changed:
ChangeLog [new file with mode: 0644]
LINKS [new file with mode: 0644]
README [new file with mode: 0644]
TODO [new file with mode: 0644]
XF86Config-4 [new file with mode: 0644]
config.h [new file with mode: 0644]
data/levelmap.txt
globals.h
jumpbump_pack_unpack_readme [new file with mode: 0644]
jumpbumpfaq.txt [new file with mode: 0644]
main.c
menu.c

diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..b1e06e5
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,28 @@
+
+25 Feb 2001 - 0.69
+   initial linux port, worked fine with freebsd too (chuck mason)
+
+26 Feb 2001 - 0.69
+   made sound be played (chuck mason)
+
+03 Mar 2001 - 0.70
+   fixing fps (longislandman)
+   changing player input: 4 player at one keyboard (tarzeau)
+   pack/unpack which packs/unpacks the leveldata (timecop)
+
+?? Mar 2001 - 0.70
+   network code has been written (longislandman, jonatkins.org)
+   it werks but we won't release it until it's good for the masses,
+   for test and fun play come join #keen on irc.linux.com
+   (be sure to have one udp port open if you have a firewall,
+   and also have sdl-mixer, sdl and sdl-net)
+              
+16 Mar 2001 - 0.70
+   did a new screenshot http://jumpbump.mine.nu/port/jumpbumprocks.jpg
+   wrote a little faq http://jumpbump.mine.nu/port/jumpbumpfaq.txt
+   put online level-selector-menu http://jumpbump.mine.nu/port/jbmenu.tcl
+   (received from philippe brochard, thank you!)
+
+20 Mar 2001 - 0.72
+   repackaged tarballs with network code jnb-net.tar.gz,
+   menusystem and unpack/pack
diff --git a/LINKS b/LINKS
new file mode 100644 (file)
index 0000000..8418c1e
--- /dev/null
+++ b/LINKS
@@ -0,0 +1,16 @@
+http://jumpbump.mine.nu/
+http://freshmeat.net/projects/jumpnbump
+http://winbe.linuxberg.com/x11html/preview/168332.html
+http://linuxapps.com/?page=application&database=current&id=3594
+http://www.linux.com/newsitem.phtml?sid=114&aid=11797
+http://www.hardcorelinux.com/free-linux-games.htm
+http://www.libsdl.org/games_db/games.php3#120
+http://www.thelinuxpimp.com/main/article.php?sid=184
+http://ee5lance.ee5.yz.yamagata-u.ac.jp/~zinnia/sdl/watch.html
+http://outpost-coder.dyndns.org/partners.html
+http://brainchilddesign.com/games/jumpnbump/index.html
+http://www.pl-berichte.de/programme/index.html
+http://providenet.linux.tucows.com/x11html/preview/168332.html
+http://bloodybunnies.8m.com
+http://gohanz.www7.50megs.com/jumpbump
+http://www.geocities.com/bkron2000
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..93b523e
--- /dev/null
+++ b/README
@@ -0,0 +1,58 @@
+
+jump n bump
+
+is a game for the whole family. you are cute fluffy little bunnies
+and hop on the other bunnies' heads.
+
+at the beginning you are in the menu, where you have to jump
+over the tree trunk if you want to play and walk right.
+then you'll enter the arena. the aim is to jump on the
+other bunnies heads...
+
+a,w,d to steer dott
+arrows to steer jiffy
+j,i,l to steer fizz
+4,8,6 to steer mijji (on the numeric pad)
+
+thanks to sabrewulf (chuck mason) in irc.linux.com #keen
+who did port this wonderful game! find him, longislandman
+and me (tarzeau) on irc.linux.com
+thanks also to longisland for working on network code
+and timecop for the pack/unpacker
+
+f10 change between windowed/fullscreen mode
+(see the XF86Config-4, copy n paste the modeline 400x256
+then add the mode "400x256" to whatever bpp you have by default, restart x)
+example: add following line in Section "Monitor" of your 
+/etc/X11/XF86Config (or XF86Config-4)
+Modeline "400x256"     22.00  400 416 480 504  256 259 262 269 doublescan
+then in Section "Screen" if your DefaultDepth is 24 do be sure you have
+something like:
+Modes           "1024x768" "640x480" "512x384" "400x256" "320x240"
+esc/f12 exit
+
+for compilation you will need:
+do following on a debian gnu/linux system (www.debian.org)
+apt-get install libsdl-dev libsdl-mixer-dev
+sdl libraries are needed, you might find it at www.libsdl.org
+
+you can find more levels at http://jumpbump.mine.nu/cgi-bin/jb.sh
+which you can start with: ./jnb -dat levelname.dat
+there's a screensaver mode as well:
+jnb -fireworks -fullscreen
+
+network play works like this, oh well here's an example
+player 1: ./jnb -port 7777 -net 0 ip_or_hostname_of_player2 port_of_player2
+player 2: ./jnb -port 7777 -net 1 ip_or_hostname_of_player1 port_of_player1
+just take port 7777 for all ports and hope it's open and you aren't
+firewalled (it's all udp!)
+you can add -net 3 and -net 4 for 3rd and 4th player, and be sure
+all the players use the same -dat level.dat
+(the scoreboards is different on each player and strange things like
+that, but longislandman is working on it (isn't it? longislandman? you alive?))
+
+you can find the original dos game (which runs in dos/win9x (dosextender!))
+at http://www.brainchilddesign.com/games/jumpnbump/index.html
+
+if you like the game or have any ideas don't hesitate to contact me
+tarzeau@space.ch
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..50d8fa3
--- /dev/null
+++ b/TODO
@@ -0,0 +1,11 @@
+
+we need a -nosound parameter because:
+
+From: "Jo eL" <jjshoe@hotmail.com>
+Date: Sun, 04 Mar 2001 15:28:33 -0000
+make a version which doesnt require sound
+wont run for me
+
+the network code is working (testing)
+/join #keen on irc.linux.com
+March 11 2001 (done by LongIslandMan, http://jonatkins.org)
diff --git a/XF86Config-4 b/XF86Config-4
new file mode 100644 (file)
index 0000000..561bb31
--- /dev/null
@@ -0,0 +1,118 @@
+# XF86Config-4 (XFree86 server configuration file) generated by Dexconf, the
+# Debian X Configuration tool, using values from the debconf database.
+#
+# Edit this file with caution, and see the XF86Config manual page.
+# (Type "man XF86Config" at the shell prompt.)
+
+Section "Files"
+       FontPath        "unix/:7100"                    # local font server
+       # if the local font server has problems, we can fall back on these
+       FontPath        "/usr/lib/X11/fonts/misc"
+       FontPath        "/usr/lib/X11/fonts/cyrillic"
+       FontPath        "/usr/lib/X11/fonts/100dpi/:unscaled"
+       FontPath        "/usr/lib/X11/fonts/75dpi/:unscaled"
+       FontPath        "/usr/lib/X11/fonts/Type1"
+       FontPath        "/usr/lib/X11/fonts/Speedo"
+       FontPath        "/usr/lib/X11/fonts/100dpi"
+       FontPath        "/usr/lib/X11/fonts/75dpi"
+EndSection
+
+Section "ServerFlags"
+EndSection
+
+Section "Module"
+       Load    "ddc"
+       Load    "GLcore"
+       Load    "dbe"
+       Load    "dri"
+       Load    "extmod"
+       Load    "glx"
+       Load    "pex5"
+       Load    "record"
+       Load    "xie"
+       Load    "bitmap"
+       Load    "freetype"
+       Load    "speedo"
+       Load    "type1"
+       Load    "vbe"
+       Load    "int10"
+EndSection
+
+Section "InputDevice"
+       Identifier      "Generic Keyboard"
+       Driver          "keyboard"
+       Option          "CoreKeyboard"
+       Option          "XkbRules"      "xfree86"
+       Option          "XkbModel"      "pc105"
+       Option          "XkbLayout"     "de_CH"
+EndSection
+
+Section "InputDevice"
+       Identifier      "Generic Mouse"
+       Driver          "mouse"
+       Option          "CorePointer"
+       Option          "Device"                "/dev/ttyS0"
+       Option          "Protocol"              "Microsoft"
+EndSection
+
+Section "Device"
+       Identifier      "Generic Video Card"
+       Driver          "nvidia"
+EndSection
+
+Section "Monitor"
+       Identifier      "Generic Monitor"
+       HorizSync       28-57
+       VertRefresh     43-90
+       Option          "DPMS"
+       #Modeline       "320x240"       15.75 320 336 384 400 240 244 246 262 doublescan
+       Modeline        "320x240"       12.588 320 336 384 400 240 245 246 262 doublescan
+        Modeline "400x256"     22.00  400 416 480 504  256 259 262 269 doublescan
+        Modeline        "512x384"       22.00 512 528 592 640 384 385 388 404 -hsync -vsync
+       #Modeline       "320x240"       15.750 320 336 384 400 240 244 246 262 doublescan
+EndSection
+
+Section "Screen"
+       Identifier      "Default Screen"
+       Device          "Generic Video Card"
+       Monitor         "Generic Monitor"
+       DefaultDepth    24
+       SubSection "Display"
+               Depth           1
+               Modes           "1152x864" "1024x768" "640x480" "320x240"
+       EndSubSection
+       SubSection "Display"
+               Depth           4
+               Modes           "1152x864" "1024x768" "640x480" "320x240"
+       EndSubSection
+       SubSection "Display"
+               Depth           8
+               Modes           "1152x864" "1024x768" "640x480" "320x240"
+       EndSubSection
+       SubSection "Display"
+               Depth           15
+               Modes           "1152x864" "1024x768" "640x480" "320x240"
+       EndSubSection
+       SubSection "Display"
+               Depth           16
+               Modes           "1152x864" "1024x768" "640x480" "320x240"
+       EndSubSection
+       SubSection "Display"
+               Depth           24
+               Modes           "1024x768" "640x480" "512x384" "400x256" "320x240"
+#"1280x1024" "1152x864" 
+       EndSubSection
+EndSection
+
+Section "ServerLayout"
+       Identifier      "Default Layout"
+       Screen          "Default Screen"
+       InputDevice     "Generic Keyboard"
+       InputDevice     "Generic Mouse"
+EndSection
+
+Section "DRI"
+       Mode    0666
+EndSection
+
+# end of XF86Config
diff --git a/config.h b/config.h
new file mode 100644 (file)
index 0000000..3362079
--- /dev/null
+++ b/config.h
@@ -0,0 +1,22 @@
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#undef DOS
+
+#ifndef DOS
+# define LINUX
+#endif
+
+#ifdef LINUX
+# define NOSOUND
+# define JNB_WIDTH 400
+# define JNB_HEIGHT 256
+#endif
+
+/* 
+#define __USE_XOPEN
+#define __USE_BSD 
+#define __USE_POSIX
+*/
+
+#endif
index 70eea4a..e87448f 100644 (file)
@@ -7,9 +7,9 @@
 1000000000000011110001
 1000000000000000000011
 1110011100000000000111
-1000000000002200000001
-1000000000022220000001
-1044440000222222222001
+1000000000003100000001
+1000000000031110000001
+1011110000311111111001
 1000000000000000000001
 1100000000000000000011
 2222222214000001333111
index a42b619..7a29f0c 100644 (file)
--- a/globals.h
+++ b/globals.h
@@ -1,20 +1,50 @@
+#ifndef __GLOBALS_H
+#define __GLOBALS_H
+
+#include "config.h"
+
 #include <stdio.h>
 #include <stdlib.h>
-#include <conio.h>
-#include <dpmi.h>
-#include <sys/nearptr.h>
-#include <pc.h>
 #include <string.h>
+#include <strings.h>
 #include <time.h>
 #include <math.h>
 #include <dj.h>
 
+#ifdef DOS
+# include <conio.h>
+# include <dpmi.h>
+# include <sys/nearptr.h>
+# include <pc.h>
+#endif
+
+#ifdef USE_SDL
+# include <sys/stat.h>
+# include <SDL/SDL.h>
+# include <SDL/SDL_mixer.h>
+#endif
+
+#ifndef USE_SDL
 #define KEY_PL1_LEFT 0xcb
 #define KEY_PL1_RIGHT  0xcd
 #define KEY_PL1_JUMP 0xc8
 #define KEY_PL2_LEFT 0x1e
 #define KEY_PL2_RIGHT  0x20
 #define KEY_PL2_JUMP 0x11
+#else
+#define KEY_PL1_LEFT SDLK_LEFT
+#define KEY_PL1_RIGHT  SDLK_RIGHT
+#define KEY_PL1_JUMP SDLK_UP
+#define KEY_PL2_LEFT SDLK_a
+#define KEY_PL2_RIGHT  SDLK_d
+#define KEY_PL2_JUMP SDLK_w
+#define KEY_PL3_LEFT SDLK_j
+#define KEY_PL3_RIGHT  SDLK_l
+#define KEY_PL3_JUMP SDLK_i
+#define KEY_PL4_LEFT SDLK_KP4
+#define KEY_PL4_RIGHT  SDLK_KP6
+#define KEY_PL4_JUMP SDLK_KP8
+#endif
 
 #define NUM_POBS 200
 #define NUM_OBJECTS 200
@@ -127,18 +157,18 @@ char *rabbit_gobs;
 char *font_gobs;
 
 
-// main.c
+/* main.c */
 
 void steer_players(void);
 void position_player(short player_num);
 void fireworks(void);
 void add_object(char type, short x, short y, long x_add, long y_add, short anim, short frame);
 void update_objects(void);
-char add_pob(int page, short x, short y, short image, char *pob_data);
-void draw_pobs(char page);
-void redraw_pob_backgrounds(char page);
-char add_leftovers(char page, short x, short y, short image, char *pob_data);
-void draw_leftovers(char page);
+char add_pob(char page, short x, short y, short image, char *pob_data);
+void draw_pobs(int page);
+void redraw_pob_backgrounds(int page);
+char add_leftovers(int page, short x, short y, short image, char *pob_data);
+void draw_leftovers(int page);
 char init_level(short level);
 void deinit_level(void);
 char init_program(int argc, char *argv[]);
@@ -153,14 +183,14 @@ int dat_filelen(char *file_name, char *dat_name);
 void write_calib_data(void);
 
 
-// menu.c
+/* menu.c */
 
 char menu(void);
 char menu_init(void);
 void menu_deinit(void);
 
 
-// gfx.c
+/* gfx.c */
 
 void open_screen(void);
 void wait_vrt(void);
@@ -177,16 +207,41 @@ short pob_hs_x(short image, char *pob_data);
 short pob_hs_y(short image, char *pob_data);
 char read_pcx(FILE * handle, char *buffer, long buf_len, char *pal);
 
-// gfx.s
+/* gfx.c */
 
 void get_block(char page, long x, long y, long width, long height, char *buffer);
 void put_block(char page, long x, long y, long width, long height, char *buffer);
 
+#ifdef LINUX
+long filelength(int handle);
+void setpalette(int index, int count, char *palette);
+void fillpalette(int red, int green, int blue);
+void flippage(long page);
+void fs_toggle();
+char *get_vgaptr(long, long, long);
+#endif
 
-// interrpt.c
+/* interrpt.c */
 
-volatile char last_keys[50];
+extern char last_keys[50];
 
 char hook_keyb_handler(void);
 void remove_keyb_handler(void);
 char key_pressed(unsigned char key);
+
+#ifdef LINUX
+char intr_sysupdate();
+#endif
+
+/* sound-linux.c */
+#ifdef LINUX
+
+void load_song(FILE *, signed int);
+void play_song();
+void update_song();
+void initsound();
+void songquit();
+
+#endif
+
+#endif
diff --git a/jumpbump_pack_unpack_readme b/jumpbump_pack_unpack_readme
new file mode 100644 (file)
index 0000000..f7649fa
--- /dev/null
@@ -0,0 +1,38 @@
+
+pack:
+
+pack -o /tmp/jumpbump.dat <file1> <file2> <file3> etc
+or you can just put all the files in a dir, cd to that dir, and do
+pack -o /tmp/jnb.dat *
+and it will put all the files in the current dir inside the packfile.
+Not much error checking, but most user stupidity is caught before bad
+things happen.  don't try things like pack -o stuff.dat ../file.c
+because it will add "../file.c" as the filename in the packfile, which
+will certainly fuck things up.
+
+unpack:
+
+unpack filename.dat
+will unpack it in the current directory.  there is no error checking, so
+if you give it /proc/kcore as input, you will probably end up with a whole
+bunch of files with really difficult to delete filenames.
+
+take a look at the code, its actualy Mad Simple(tm).  Just like I thought,
+the files were not compressed.  I commented pack.c sparsely, but unpack.c
+is just so simple it doesn't need commenting.
+
+Order of files in the .dat archive doesnt matter - bump.mod doesn't have
+to be first, etc.  Loader finds them just fine.
+
+In order to make sense of the code, it needs to be split up into a lot of
+little .c files, each dealing with a set of things.  Also, DOS/whatever
+support needs to be dropped, because it's impossible to understand shit
+through a mess of #ifdef etc.  Each .c would deal with say, .dat I/O, gfx,
+players, AI, network, game init, music, etc.  The way the shit is right
+now its one hell of a huge mess that makes very little sense.
+
+I am going to play around with modularizing the code and trying to
+understand it, and hopefully make some sense out of it.  Before it makes
+sense its pointless trying to add things.
+
+tc
diff --git a/jumpbumpfaq.txt b/jumpbumpfaq.txt
new file mode 100644 (file)
index 0000000..5cd30e1
--- /dev/null
@@ -0,0 +1,38 @@
+
+little faq for jump n bump on linux
+
+Q: -nosound option doesn't werk?
+A: we know, it will be fixed some day... (contributions welcome)
+
+Q: sound effects sound other than on the dos version!
+A: i know, the *plop* (if you kill some bunnies) comes too late (lagged)
+   and sounds completely wrong too?
+   there's sound effects missing if you are near the flies and if
+   you jump into the water (the *splash* is missing)
+   
+Q: i can't download this or that level. you not have enough bandwith?
+A: longislandman did a mirror try it from there
+   http://jonatkins.org/jumpnbump/levels/
+   he has got most of the levels i have (some are missing maybe)
+
+Q: can i do my own level? how?
+A: sure.. (oh i will explain some day later how et al..)
+
+Q: do i need click each level one by one to save them? i want all of them?
+A: no just go into your jumpnbump directory into data there type
+   wget --no-parent -r -l1 http://jumpbump.mine.nu/levels.bz2
+   mv jumpbump.mine.nu/*.bz2 .
+   rm -rf jumpbump.mine.nu
+   bunzip *.bz2
+   (oh well i didn't thest it :)
+
+Q: my menuselector looks other than yours?
+A: that's probably because i have tkstep8.0 and changed the first
+   line in jbrun.tcl to (wish8.0)
+
+Q: i want to do a link to your homepage?
+A: find banners here http://jumpbump.mine.nu/jbbanner1.jpg
+   here http://jumpbump.mine.nu/jbbanner2.jpg
+   and here http://jumpbump.mine.nu/jbbanner3.jpg
+   add something like this to your homepage:
+   <a href="http://jumpbump.mine.nu"><img src="http://jumpbump.mine.nu/jbbanner1.jpg" width="325" height="50">
diff --git a/main.c b/main.c
index bfe3675..dee1bd1 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,7 +1,9 @@
 #include "globals.h"
 
 
+#ifdef DOS
 __dpmi_regs regs;
+#endif
 
 char *object_gobs;
 char *number_gobs;
@@ -172,16 +174,16 @@ struct {
 char pogostick, bunnies_in_space, jetpack, lord_of_the_flies, blood_is_thicker_than_water;
 
 
-char main(int argc, char *argv[])
+int main(int argc, char *argv[])
 {
        FILE *handle;
-       int c1, c2, c3, c4;
-       int l1, l2;
+       int c1, c2 = 0, c3, c4;
+       int l1;
        int s1, s2, s3, s4;
-       int closest_player, dist, cur_dist;
+       int closest_player = 0, dist, cur_dist;
        char end_loop_flag, fade_flag;
        char mod_vol, sfx_vol, mod_fade_direction;
-       char *ptr1;
+       char *ptr1 = (char *) NULL;
        char str1[100];
 
        if (init_program(argc, argv) != 0)
@@ -197,27 +199,20 @@ char main(int argc, char *argv[])
                if (menu() != 0)
                        deinit_program();
 
-               if (key_pressed(1) == 1)
+               if (key_pressed(1) == 1) {
                        break;
-
+               }
                if (init_level(0) != 0) {
                        deinit_level();
                        deinit_program();
                }
 
-               outportb(0x3c8, 0);
-               for (c1 = 0; c1 < 768; c1++)
-                       outportb(0x3c9, cur_pal[c1]);
+               setpalette(0, 256, cur_pal);
 
-               for (c1 = 0; c1 < 4; c1++) {
-                       outportw(0x3c4, ((1 << c1) << 8) + 0x02);
-                       l1 = c1;
-                       for (l2 = 0; l2 < 25600; l2++) {
-                               *(char *) (0xa0000 + l2 + __djgpp_conventional_base) = *(char *) (background_pic + l1);
-                               *(char *) (0xa0000 + 32768 + l2 + __djgpp_conventional_base) = *(char *) (background_pic + l1);
-                               l1 += 4;
-                       }
-               }
+               flippage(1);
+               put_block(1, 0, 0, 400, 256, background_pic);
+               put_block(0, 0, 0, 400, 256, background_pic);
+               flippage(0);
 
                s1 = rnd(250) + 50;
                s2 = rnd(150) + 50;
@@ -588,6 +583,7 @@ char main(int argc, char *argv[])
 
                        dj_mix();
 
+#ifdef DOS
                        ptr1 = (char *) (0xa0000 + ((long) main_info.draw_page << 15) - __djgpp_base_address);
                        for (c1 = 0; c1 < 4; c1++) {
                                outportw(0x3ce, (c1 << 8) + 0x04);
@@ -601,6 +597,15 @@ char main(int argc, char *argv[])
                                        }
                                }
                        }
+#else
+                       ptr1 = (char *) get_vgaptr(main_info.draw_page, 0, 0);
+                       for (c2 = 0; c2 < NUM_FLIES; c2++) {
+                               flies[c2].back[main_info.draw_page] = *(char *) (ptr1 + flies[c2].y * JNB_WIDTH + (flies[c2].x));
+                               flies[c2].back_defined[main_info.draw_page] = 1;
+                               if (mask_pic[(flies[c2].y * 400) + flies[c2].x] == 0)
+                                       *(char *) (ptr1 + flies[c2].y * JNB_WIDTH + (flies[c2].x)) = 0;
+                       }
+#endif
 
                        if (mod_fade_direction == 1) {
                                if (mod_vol < 30) {
@@ -642,20 +647,19 @@ char main(int argc, char *argv[])
                        main_info.draw_page ^= 1;
                        main_info.view_page ^= 1;
 
-                       outportw(0x3d4, (main_info.view_page << 23) + 0x0d);
-                       outportw(0x3d4, ((main_info.view_page << 15) & 0xff00) + 0x0c);
+                       flippage(main_info.view_page);
 
+#ifdef DOS
                        while ((inportb(0x3da) & 8) == 0)
                                dj_mix();
                        while ((inportb(0x3da) & 8) == 8)
                                dj_mix();
+#endif
 
-                       if (fade_flag == 1) {
-                               outportb(0x3c8, 0);
-                               for (c1 = 0; c1 < 768; c1++)
-                                       outportb(0x3c9, cur_pal[c1]);
-                       }
+                       if (fade_flag == 1)
+                               setpalette(0, 256, cur_pal);
 
+#ifdef DOS
                        ptr1 = (char *) (0xa0000 + ((long) main_info.draw_page << 15) - __djgpp_base_address);
                        for (c1 = 0; c1 < 4; c1++) {
                                outportw(0x3c4, ((1 << c1) << 8) + 0x02);
@@ -664,21 +668,39 @@ char main(int argc, char *argv[])
                                                *(char *) (ptr1 + flies[c2].old_y * 100 + (flies[c2].old_x >> 2)) = flies[c2].back[main_info.draw_page];
                                }
                        }
+#else
+                       ptr1 = (char *) get_vgaptr(main_info.draw_page, 0, 0);
+                       for (c2 = NUM_FLIES - 1; c2 >= 0; c2--) {
+                               if (flies[c2].back_defined[main_info.draw_page] == 1)
+                                       *(char *) (ptr1 + flies[c2].old_y * JNB_WIDTH + (flies[c2].old_x)) = flies[c2].back[main_info.draw_page];
+                       }
+#endif
 
                        redraw_pob_backgrounds(main_info.draw_page);
 
                        draw_leftovers(main_info.draw_page);
 
+                       intr_sysupdate();
+
                }
 
+#ifndef DOS
+               main_info.view_page = 0;
+               main_info.draw_page = 1;
+#endif
+
                dj_stop_sfx_channel(4);
 
                deinit_level();
 
                memset(mask_pic, 0, 102400L);
 
+#ifdef DOS
                outportw(0x3c4, 0x0f02);
                memset((char *) (0xa0000 + (long) (main_info.view_page << 15) + __djgpp_conventional_base), 0, 32768);
+#else
+               memset((void *) get_vgaptr(main_info.view_page, 0, 0), 0, JNB_WIDTH * JNB_HEIGHT);
+#endif
                put_text(main_info.view_page, 100, 50, "DOTT", 2);
                put_text(main_info.view_page, 160, 50, "JIFFY", 2);
                put_text(main_info.view_page, 220, 50, "FIZZ", 2);
@@ -687,19 +709,25 @@ char main(int argc, char *argv[])
                put_text(main_info.view_page, 40, 110, "JIFFY", 2);
                put_text(main_info.view_page, 40, 140, "FIZZ", 2);
                put_text(main_info.view_page, 40, 170, "MIJJI", 2);
+
                for (c1 = 0; c1 < 4; c1++) {
                        for (c2 = 0; c2 < 4; c2++) {
                                if (c2 != c1) {
-                                       itoa(player[c1].bumped[c2], str1, 10);
+                                       sprintf(str1, "%d", player[c1].bumped[c2]);
                                        put_text(main_info.view_page, 100 + c2 * 60, 80 + c1 * 30, str1, 2);
                                } else
                                        put_text(main_info.view_page, 100 + c2 * 60, 80 + c1 * 30, "-", 2);
                        }
-                       itoa(player[c1].bumps, str1, 10);
+                       sprintf(str1, "%d", player[c1].bumps);
                        put_text(main_info.view_page, 350, 80 + c1 * 30, str1, 2);
                }
+
                put_text(main_info.view_page, 200, 230, "Press ESC to continue", 2);
 
+#ifndef DOS
+               flippage(main_info.view_page);
+#endif
+
                if ((handle = dat_open("menu.pcx", datfile_name, "rb")) == 0) {
                        strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
                        return 1;
@@ -712,9 +740,7 @@ char main(int argc, char *argv[])
 
                memset(cur_pal, 0, 768);
 
-               outportb(0x3c8, 0);
-               for (c1 = 0; c1 < 768; c1++)
-                       outportb(0x3c9, cur_pal[c1]);
+               setpalette(0, 256, cur_pal);
 
                mod_vol = 0;
                dj_ready_mod(MOD_SCORES);
@@ -731,13 +757,14 @@ char main(int argc, char *argv[])
                                        cur_pal[c1]++;
                        }
                        dj_mix();
+                       intr_sysupdate();
                        wait_vrt();
-                       outportb(0x3c8, 0);
-                       for (c1 = 0; c1 < 768; c1++)
-                               outportb(0x3c9, cur_pal[c1]);
+                       setpalette(0, 256, cur_pal);
                }
-               while (key_pressed(1) == 1)
+               while (key_pressed(1) == 1) {
                        dj_mix();
+                       intr_sysupdate();
+               }
 
                memset(pal, 0, 768);
 
@@ -750,14 +777,10 @@ char main(int argc, char *argv[])
                        }
                        dj_mix();
                        wait_vrt();
-                       outportb(0x3c8, 0);
-                       for (c1 = 0; c1 < 768; c1++)
-                               outportb(0x3c9, cur_pal[c1]);
+                       setpalette(0, 256, cur_pal);
                }
 
-               outportb(0x3c8, 0);
-               for (c1 = 0; c1 < 768; c1++)
-                       outportb(0x3c9, 0);
+               fillpalette(0, 0, 0);
 
                dj_set_nosound(1);
                dj_stop_mod();
@@ -766,13 +789,14 @@ char main(int argc, char *argv[])
 
        deinit_program();
 
+       return 0;
 }
 
 
 void steer_players(void)
 {
        int c1, c2;
-       int s1, s2;
+       int s1 = 0, s2 = 0;
 
        if (main_info.mouse_enabled == 1)
                read_mouse();
@@ -785,9 +809,9 @@ void steer_players(void)
 
                        if (player[c1].dead_flag == 0) {
 
-                               if ((c1 == 0 && ((key_pressed(KEY_PL1_LEFT) == 1 && key_pressed(KEY_PL1_RIGHT) == 1))) || (c1 == 1 && ((key_pressed(KEY_PL2_LEFT) == 1 && key_pressed(KEY_PL2_RIGHT) == 1))) || (c1 == 2 && ((joy.x < -512 && joy.x > 512))) || (c1 == 3 && ((mouse.but1 == 1 && mouse.but2 == 1)))) {
+                               if ((c1 == 0 && ((key_pressed(KEY_PL1_LEFT) == 1 && key_pressed(KEY_PL1_RIGHT) == 1))) || (c1 == 1 && ((key_pressed(KEY_PL2_LEFT) == 1 && key_pressed(KEY_PL2_RIGHT) == 1))) || (c1 == 2 && ((key_pressed(KEY_PL3_LEFT) == 1 && key_pressed(KEY_PL3_RIGHT) == 1))) || (c1 == 3 && ((key_pressed(KEY_PL4_LEFT) == 1 && key_pressed(KEY_PL4_RIGHT) == 1)))) {
                                        if (player[c1].direction == 0) {
-                                               if ((c1 == 0 && key_pressed(KEY_PL1_RIGHT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_RIGHT) == 1) || (c1 == 2 && joy.x > 512) || (c1 == 3 && mouse.but2 == 1)) {
+                                               if ((c1 == 0 && key_pressed(KEY_PL1_RIGHT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_RIGHT) == 1) || (c1 == 2 && key_pressed(KEY_PL3_RIGHT) == 1) || (c1 == 3 && key_pressed(KEY_PL4_RIGHT) == 1 mouse.but2 == 1)) {
                                                        s1 = (player[c1].x >> 16);
                                                        s2 = (player[c1].y >> 16);
                                                        if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 3) {
@@ -819,7 +843,7 @@ void steer_players(void)
                                                        }
                                                }
                                        } else {
-                                               if ((c1 == 0 && key_pressed(KEY_PL1_LEFT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_LEFT) == 1) || (c1 == 2 && joy.x < -512) || (c1 == 3 && mouse.but1 == 1)) {
+                                               if ((c1 == 0 && key_pressed(KEY_PL1_LEFT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_LEFT) == 1) || (c1 == 2 && key_pressed(KEY_PL3_LEFT) == 1) || (c1 == 3 && key_pressed(KEY_PL4_LEFT) == 1)) {
                                                        s1 = (player[c1].x >> 16);
                                                        s2 = (player[c1].y >> 16);
                                                        if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 3) {
@@ -851,7 +875,7 @@ void steer_players(void)
                                                        }
                                                }
                                        }
-                               } else if ((c1 == 0 && key_pressed(KEY_PL1_LEFT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_LEFT) == 1) || (c1 == 2 && joy.x < -512) || (c1 == 3 && mouse.but1 == 1)) {
+                               } else if ((c1 == 0 && key_pressed(KEY_PL1_LEFT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_LEFT) == 1) || (c1 == 2 && key_pressed(KEY_PL3_LEFT) == 1) || (c1 == 3 && key_pressed(KEY_PL4_LEFT) == 1)) {
                                        s1 = (player[c1].x >> 16);
                                        s2 = (player[c1].y >> 16);
                                        if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 3) {
@@ -881,7 +905,7 @@ void steer_players(void)
                                                player[c1].frame_tick = 0;
                                                player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
                                        }
-                               } else if ((c1 == 0 && key_pressed(KEY_PL1_RIGHT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_RIGHT) == 1) || (c1 == 2 && joy.x > 512) || (c1 == 3 && mouse.but2 == 1)) {
+                               } else if ((c1 == 0 && key_pressed(KEY_PL1_RIGHT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_RIGHT) == 1) || (c1 == 2 && key_pressed(KEY_PL3_RIGHT)) || (c1 == 3 && key_pressed(KEY_PL4_RIGHT))) {
                                        s1 = (player[c1].x >> 16);
                                        s2 = (player[c1].y >> 16);
                                        if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 3) {
@@ -911,7 +935,7 @@ void steer_players(void)
                                                player[c1].frame_tick = 0;
                                                player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
                                        }
-                               } else if ((c1 == 0 && ((key_pressed(KEY_PL1_LEFT) == 0 && key_pressed(KEY_PL1_RIGHT) == 0))) || (c1 == 1 && ((key_pressed(KEY_PL2_LEFT) == 0 && key_pressed(KEY_PL2_RIGHT) == 0))) || (c1 == 2 && ((joy.x >= -512 && joy.x <= 512))) || (c1 == 3 && ((mouse.but1 == 0 && mouse.but2 == 0)))) {
+                               } else if ((c1 == 0 && ((key_pressed(KEY_PL1_LEFT) == 0 && key_pressed(KEY_PL1_RIGHT) == 0))) || (c1 == 1 && ((key_pressed(KEY_PL2_LEFT) == 0 && key_pressed(KEY_PL2_RIGHT) == 0))) || (c1 == 2 && ((key_pressed(KEY_PL3_LEFT) == 0 && key_pressed(KEY_PL3_RIGHT) == 0))) || (c1 == 3 && ((key_pressed(KEY_PL4_LEFT) == 0 && key_pressed(KEY_PL4_RIGHT) == 0)))) {
                                        s1 = (player[c1].x >> 16);
                                        s2 = (player[c1].y >> 16);
                                        if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 1 || ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 4 || (((ban_map[(s2 + 16) >> 4][s1 >> 4] == 1 || ban_map[(s2 + 16) >> 4][s1 >> 4] == 4) && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] != 3) || (ban_map[(s2 + 16) >> 4][s1 >> 4] != 3 && (ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == 1 || ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == 4)))) {
@@ -935,7 +959,7 @@ void steer_players(void)
                                        }
                                }
                                if (jetpack == 0) {
-                                       if (pogostick == 1 || (player[c1].jump_ready == 1 && ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 1) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 1) || (c1 == 2 && joy.but1 == 1) || (c1 == 3 && ((main_info.num_mouse_buttons == 2 && mouse.but1 == 1 && mouse.but2 == 1) || (main_info.num_mouse_buttons == 3 && mouse.but3 == 1)))))) {
+                                       if (pogostick == 1 || (player[c1].jump_ready == 1 && ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 1) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 1) || (c1 == 2 && key_pressed(KEY_PL3_JUMP) == 1) || (c1 == 3 && key_pressed(KEY_PL4_JUMP) == 1)))) {
                                                s1 = (player[c1].x >> 16);
                                                s2 = (player[c1].y >> 16);
                                                if (s2 < -16)
@@ -968,7 +992,7 @@ void steer_players(void)
                                                                dj_play_sfx(SFX_SPRING, SFX_SPRING_FREQ + rnd(2000) - 1000, 64, 0, 0, -1);
                                                }
                                        }
-                                       if (pogostick == 0 && ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 0) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 0) || (c1 == 2 && joy.but1 == 0) || (c1 == 3 && ((main_info.num_mouse_buttons == 2 && (mouse.but1 == 0 && mouse.but2 == 0)) || (main_info.num_mouse_buttons == 3 && mouse.but3 == 0))))) {
+                                       if (pogostick == 0 && ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 0) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 0) || (c1 == 2 && key_pressed(KEY_PL3_JUMP) == 0) || (c1 == 3 && key_pressed(KEY_PL4_JUMP) == 0))) {
                                                player[c1].jump_ready = 1;
                                                if (player[c1].in_water == 0 && player[c1].y_add < 0 && player[c1].jump_abort == 1) {
                                                        if (bunnies_in_space == 0)
@@ -984,7 +1008,7 @@ void steer_players(void)
 
                                } else {
 
-                                       if (((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 1) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 1) || (c1 == 2 && joy.but1 == 1) || (c1 == 3 && mouse.but3 == 1))) {
+                                       if (((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 1) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 1) || (c1 == 2 && key_pressed(KEY_PL3_JUMP) == 1) || (c1 == 3 && key_pressed(KEY_PL4_JUMP) == 1))) {
                                                player[c1].y_add -= 16384;
                                                if (player[c1].y_add < -400000L)
                                                        player[c1].y_add = -400000L;
@@ -1230,8 +1254,12 @@ void fireworks(void)
                char col, back[2];
        } stars[300];
 
+#ifdef DOS
        outportw(0x3c4, 0x0f02);
        memset((char *) (0xa0000 - __djgpp_base_address), 0, 65535);
+#else
+       memset((char *) get_vgaptr(0, 0, 0), 0, JNB_WIDTH * JNB_HEIGHT);
+#endif
 
        if ((handle = dat_open("level.pcx", datfile_name, "rb")) == 0) {
                strcpy(main_info.error_str, "Error loading 'level.pcx', aborting...\n");
@@ -1244,10 +1272,9 @@ void fireworks(void)
 
        memset(ban_map, 0, sizeof(ban_map));
 
-       outportb(0x3c8, 0);
-       for (c1 = 0; c1 < 768; c1++)
-               outportb(0x3c9, 0);
+       fillpalette(0, 0, 0);
 
+#ifdef DOS
        for (c1 = 0; c1 < 4; c1++) {
                outportw(0x3c4, ((1 << c1) << 8) + 0x02);
                for (c2 = 193; c2 < 256; c2++) {
@@ -1255,10 +1282,13 @@ void fireworks(void)
                        memset((void *) (0xa0000 + 32768 + c2 * 100 - __djgpp_base_address), (c2 - 192) >> 2, 100);
                }
        }
+#else
+       for (c2 = 193; c2 < 256; c2++) {
+               memset((void *) get_vgaptr(0, 0, c2), (c2 - 192) >> 2, 400);
+       }
+#endif
 
-       outportb(0x3c8, 0);
-       for (c1 = 0; c1 < 768; c1++)
-               outportb(0x3c9, pal[c1]);
+       setpalette(0, 256, pal);
 
        for (c1 = 0; c1 < 20; c1++)
                rabbits[c1].used = 0;
@@ -1286,8 +1316,12 @@ void fireworks(void)
                stars[c1].x = stars[c1].old_x = (s1 << 16);
                stars[c1].y = stars[c1].old_y = (s2 << 16);
                stars[c1].col = s3;
+#ifdef DOS
                outportw(0x3ce, ((s1 & 3) << 8) + 0x04);
                stars[c1].back[0] = stars[c1].back[1] = *(char *) (0xa0000 + s2 * 100 + (s1 >> 2) - __djgpp_base_address);
+#else
+               stars[c1].back[0] = stars[c1].back[1] = *(char *) get_vgaptr(0, s1, s2);
+#endif
        }
 
        dj_set_nosound(0);
@@ -1300,6 +1334,7 @@ void fireworks(void)
        while (key_pressed(1) == 0) {
 
                dj_mix();
+               intr_sysupdate();
 
                for (c1 = 0; c1 < 300; c1++) {
                        stars[c1].old_x = stars[c1].x;
@@ -1391,10 +1426,15 @@ void fireworks(void)
                update_objects();
 
                for (c1 = 0; c1 < 300; c1++) {
+#ifdef DOS
                        outportw(0x3ce, (((stars[c1].x >> 16) & 3) << 8) + 0x04);
                        outportw(0x3c4, ((1 << ((stars[c1].x >> 16) & 3)) << 8) + 0x02);
                        stars[c1].back[main_info.draw_page] = *(char *) (0xa0000 + ((int) main_info.draw_page << 15) + (stars[c1].y >> 16) * 100 + (stars[c1].x >> 18) - __djgpp_base_address);
                        *(char *) (0xa0000 + ((int) main_info.draw_page << 15) + (stars[c1].y >> 16) * 100 + (stars[c1].x >> 18) - __djgpp_base_address) = stars[c1].col;
+#else
+                       stars[c1].back[main_info.draw_page] = *(char *) get_vgaptr(main_info.draw_page, stars[c1].x >> 16, stars[c1].y >> 16);
+                       *(char *) get_vgaptr(main_info.draw_page, stars[c1].x >> 16, stars[c1].y >> 16) = stars[c1].col;
+#endif
                }
 
                dj_mix();
@@ -1403,22 +1443,34 @@ void fireworks(void)
 
                main_info.draw_page ^= 1;
                main_info.view_page ^= 1;
+#ifdef DOS
                outportw(0x3d4, (main_info.view_page << 23) + 0x0d);
                outportw(0x3d4, ((main_info.view_page << 15) & 0xff00) + 0x0c);
+#else
+               flippage(main_info.view_page);
+#endif
 
+#ifdef DOS
                while ((inportb(0x3da) & 8) == 0)
                        dj_mix();
                while ((inportb(0x3da) & 8) == 8)
                        dj_mix();
+#endif
 
                redraw_pob_backgrounds(main_info.draw_page);
 
                dj_mix();
+               intr_sysupdate();
 
                for (c1 = 299; c1 >= 0; c1--) {
+#ifdef DOS
                        outportw(0x3c4, ((1 << ((stars[c1].old_x >> 16) & 3)) << 8) + 0x02);
                        *(char *) (0xa0000 + ((int) main_info.draw_page << 15) + (stars[c1].old_y >> 16) * 100 + (stars[c1].old_x >> 18) - __djgpp_base_address) = stars[c1].back[main_info.draw_page];
+#else
+                       *(char *) get_vgaptr(main_info.draw_page, stars[c1].old_x >> 16, stars[c1].old_y >> 16) = stars[c1].back[main_info.draw_page];
+#endif
                }
+
        }
 
        dj_set_nosound(1);
@@ -1454,7 +1506,7 @@ void add_object(char type, short x, short y, long x_add, long y_add, short anim,
 void update_objects(void)
 {
        int c1;
-       int s1;
+       int s1 = 0;
 
        for (c1 = 0; c1 < NUM_OBJECTS; c1++) {
                if (objects[c1].used == 1) {
@@ -1785,7 +1837,7 @@ void update_objects(void)
 }
 
 
-char add_pob(char page, short x, short y, short image, char *pob_data)
+char add_pob(int page, short x, short y, short image, char *pob_data)
 {
 
        if (main_info.page_info[page].num_pobs >= NUM_POBS)
@@ -1802,7 +1854,7 @@ char add_pob(char page, short x, short y, short image, char *pob_data)
 }
 
 
-void draw_pobs(char page)
+void draw_pobs(int page)
 {
        int c1;
        int back_buf_ofs;
@@ -1819,7 +1871,7 @@ void draw_pobs(char page)
 }
 
 
-void redraw_pob_backgrounds(char page)
+void redraw_pob_backgrounds(int page)
 {
        int c1;
 
@@ -1829,7 +1881,7 @@ void redraw_pob_backgrounds(char page)
 }
 
 
-char add_leftovers(char page, short x, short y, short image, char *pob_data)
+char add_leftovers(int page, short x, short y, short image, char *pob_data)
 {
 
        if (leftovers.page[page].num_pobs >= NUM_LEFTOVERS)
@@ -1846,7 +1898,7 @@ char add_leftovers(char page, short x, short y, short image, char *pob_data)
 }
 
 
-void draw_leftovers(char page)
+void draw_leftovers(int page)
 {
        int c1;
 
@@ -1952,9 +2004,9 @@ void deinit_level(void)
 
 char init_program(int argc, char *argv[])
 {
-       FILE *handle;
-       int c1, c2;
-       char load_flag;
+       FILE *handle = (FILE *) NULL;
+       int c1 = 0, c2 = 0;
+       char load_flag = 0;
        char force2, force3;
        int player_anim_data[] = {
                1, 0, 0, 0x7fff, 0, 0, 0, 0, 0, 0,
@@ -1966,18 +2018,20 @@ char init_program(int argc, char *argv[])
                1, 0, 8, 5, 0, 0, 0, 0, 0, 0
        };
 
+#ifdef DOS
        if (__djgpp_nearptr_enable() == 0)
                return 1;
+#endif
 
-       srandom(time(0));
+       srand(time(NULL));
 
        if (hook_keyb_handler() != 0)
                return 1;
 
        memset(&main_info, 0, sizeof(main_info));
-       main_info.joy_enabled = 1;
+       main_info.joy_enabled = 0;      /* CHANGE THIS FOR JOY */
 
-       strcpy(datfile_name, "jumpbump.dat");
+       strcpy(datfile_name, "data/jumpbump.dat");
 
        force2 = force3 = 0;
 
@@ -1991,6 +2045,10 @@ char init_program(int argc, char *argv[])
                                main_info.joy_enabled = 0;
                        else if (stricmp(argv[c1], "-fireworks") == 0)
                                main_info.fireworks = 1;
+#ifdef USE_SDL
+                       else if (stricmp(argv[c1], "-fullscreen") == 0)
+                               fs_toggle();
+#endif
                        else if (stricmp(argv[c1], "-dat") == 0) {
                                if (c1 < (argc - 1)) {
                                        if ((handle = fopen(argv[c1 + 1], "rb")) != NULL) {
@@ -2018,9 +2076,9 @@ char init_program(int argc, char *argv[])
                }
        }
 
-       if ((background_pic = malloc(102400L)) == 0)
+       if ((background_pic = malloc(102400)) == NULL)
                return 1;
-       if ((mask_pic = malloc(102400L)) == 0)
+       if ((mask_pic = malloc(102400)) == NULL)
                return 1;
        memset(mask_pic, 0, 102400);
 
@@ -2196,18 +2254,18 @@ char init_program(int argc, char *argv[])
        }
        fclose(handle);
 
-       outportb(0x3c8, 0);
-       for (c1 = 0; c1 < 768; c1++)
-               outportb(0x3c9, pal[c1]);
+       setpalette(0, 256, pal);
 
        if (main_info.joy_enabled == 1 && main_info.fireworks == 0) {
                c1 = 0;
+#ifdef DOS
                outportb(0x201, 0);
                while (c1 < 0x7fff) {
                        if ((inportb(0x201) & 1) == 0)
                                break;
                        c1++;
                }
+#endif
                if (c1 != 0x7fff) {
                        main_info.joy_enabled = 1;
                        load_flag = 0;
@@ -2220,11 +2278,20 @@ char init_program(int argc, char *argv[])
                        if (calib_joy(0) != 0)
                                load_flag = 1;
                        else {
+#ifdef DOS
                                outportw(0x3c4, 0x0f02);
                                memset((char *) (0xa0000 + 32768 + __djgpp_conventional_base), 0, 32768);
+#else
+                               memset((char *) get_vgaptr(1, 0, 0), 0, JNB_WIDTH * JNB_HEIGHT);
+#endif
+
                                main_info.view_page = 1;
+#ifdef DOS
                                outportw(0x3d4, (1 << 23) + 0x0d);
                                outportw(0x3d4, ((1 << 15) & 0xff00) + 0x0c);
+#else
+                               flippage(main_info.view_page);
+#endif
                                wait_vrt();
 
                                put_text(1, 200, 40, "JOYSTICK CALIBRATION", 2);
@@ -2236,10 +2303,12 @@ char init_program(int argc, char *argv[])
                                if (calib_joy(1) != 0)
                                        load_flag = 1;
                                else {
+#ifdef DOS
                                        outportw(0x3c4, 0x0f02);
                                        memset((char *) (0xa0000 + __djgpp_conventional_base), 0, 32768);
                                        outportw(0x3d4, (0 << 23) + 0x0d);
                                        outportw(0x3d4, ((0 << 15) & 0xff00) + 0x0c);
+#endif
                                        wait_vrt();
 
                                        put_text(0, 200, 40, "JOYSTICK CALIBRATION", 2);
@@ -2280,7 +2349,7 @@ char init_program(int argc, char *argv[])
                        main_info.joy_enabled = 0;
 
        }
-
+#ifdef DOS
        regs.x.ax = 0;
        __dpmi_int(0x33, &regs);
        if (regs.x.ax == 0xffff) {
@@ -2291,6 +2360,7 @@ char init_program(int argc, char *argv[])
                if (force3 == 1)
                        main_info.num_mouse_buttons = 3;
        } else
+#endif
                main_info.mouse_enabled = 0;
 
        return 0;
@@ -2300,7 +2370,9 @@ char init_program(int argc, char *argv[])
 
 void deinit_program(void)
 {
+#ifdef DOS
        __dpmi_regs regs;
+#endif
 
        dj_stop();
        dj_free_mod(MOD_MENU);
@@ -2329,8 +2401,13 @@ void deinit_program(void)
 
        remove_keyb_handler();
 
+#ifdef DOS
        regs.x.ax = 0x3;
        __dpmi_int(0x10, &regs);
+#else
+       songquit();
+       SDL_Quit();
+#endif
 
        if (main_info.error_str[0] != 0) {
                printf(main_info.error_str);
@@ -2345,15 +2422,19 @@ void read_joy(void)
 {
        int c1;
        int x, y;
-       int s1;
+       int s1 = 0;
        char flag;
 
        c1 = x = y = flag = 0;
+#ifdef DOS
        outportb(0x201, 0);
+#endif
 
        while (1) {
 
+#ifdef DOS
                s1 = inportb(0x201);
+#endif
 
                if (x == 0) {
                        if ((s1 & 1) == 0)
@@ -2396,7 +2477,9 @@ void read_joy(void)
                if (joy.y > 1024)
                        joy.y = 1024;
 
+#ifdef DOS
                s1 = inportb(0x201);
+#endif
                joy.but1 = (((s1 >> 4) & 1) ^ 1);
                joy.but2 = (((s1 >> 5) & 1) ^ 1);
        } else {
@@ -2415,12 +2498,14 @@ char calib_joy(char type)
 {
        int c1;
        int x, y;
-       int s1;
+       int s1 = 0;
        int num_times;
-       char flag;
+       char flag = 0;
 
        while (joy.but1 == 1) {
+#ifdef DOS
                s1 = inportb(0x201);
+#endif
                joy.but1 = (((s1 >> 4) & 1) ^ 1);
                if (key_pressed(1) == 1) {
                        while (key_pressed(1) == 1);
@@ -2433,11 +2518,15 @@ char calib_joy(char type)
        while (joy.but1 == 0) {
 
                c1 = x = y = flag = 0;
+#ifdef DOS
                outportb(0x201, 0);
+#endif
 
                while (1) {
 
+#ifdef DOS
                        s1 = inportb(0x201);
+#endif
 
                        if (x == 0) {
                                if ((s1 & 1) == 0)
@@ -2461,7 +2550,9 @@ char calib_joy(char type)
                joy.raw_x = x;
                joy.raw_y = y;
 
+#ifdef DOS
                s1 = inportb(0x201);
+#endif
                joy.but1 = (((s1 >> 4) & 1) ^ 1);
 
                if (num_times < 0x7fffffff)
@@ -2498,7 +2589,9 @@ char calib_joy(char type)
                }
 
                while (joy.but1 == 1) {
+#ifdef DOS
                        s1 = inportb(0x201);
+#endif
                        joy.but1 = (((s1 >> 4) & 1) ^ 1);
                }
 
@@ -2512,11 +2605,13 @@ char calib_joy(char type)
 void read_mouse(void)
 {
 
+#ifdef DOS
        regs.x.ax = 3;
        __dpmi_int(0x33, &regs);
        mouse.but1 = regs.x.bx & 1;
        mouse.but2 = (regs.x.bx & 2) >> 1;
        mouse.but3 = (regs.x.bx & 4) >> 2;
+#endif
 
 }
 
@@ -2606,11 +2701,14 @@ int dat_filelen(char *file_name, char *dat_name)
                if (strnicmp(name, file_name, strlen(file_name)) == 0) {
                        fseek(handle, 4, SEEK_CUR);
                        len = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
+
+                       fclose(handle);
                        return len;
                }
                fseek(handle, 8, SEEK_CUR);
        }
 
+       fclose(handle);
        return 0;
 }
 
diff --git a/menu.c b/menu.c
index efbc06a..0a36524 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -1,6 +1,6 @@
 #include "globals.h"
 
-#define NUM_MESSAGES 24
+#define NUM_MESSAGES 25
 
 char *menu_background;
 
@@ -14,6 +14,7 @@ char message[NUM_MESSAGES][70] = {
        "Graphics by Martin Magnusson",
        "and Andreas Brynervall.",
        "Music by Anders Nilsson.",
+       "Linux port by Chuck Mason.",
        "Visit our homepage at:",
        "http://www.algonet.se/~mattiasb",
        "Jump 'n Bump is e-mailware.",
@@ -40,7 +41,7 @@ char menu(void)
        int c1;
        char esc_pressed;
        char end_loop_flag, new_game_flag, fade_flag;
-       char mod_vol, mod_fade_direction;
+       char mod_vol = 0, mod_fade_direction = 0;
        int cur_message;
        int fade_dir, fade_count, fade_tick;
        char fade_pal[48];
@@ -57,9 +58,8 @@ char menu(void)
        dj_set_nosound(0);
 
        memset(fade_pal, 0, 48);
-       outportb(0x3c8, 240);
-       for (c1 = 0; c1 < 48; c1++)
-               outportb(0x3c9, fade_pal[c1]);
+       setpalette(240, 16, fade_pal);
+
        fade_dir = 0;
        fade_count = 0;
        fade_tick = 0;
@@ -76,6 +76,7 @@ char menu(void)
        while (1) {
 
                dj_mix();
+               intr_sysupdate();
 
                if (key_pressed(1) == 1 && esc_pressed == 0) {
                        end_loop_flag = 1;
@@ -107,7 +108,7 @@ char menu(void)
                                        }
                                        player[c1].enabled = 1;
                                }
-                               if ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 0) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 0) || (c1 == 2 && joy.but1 == 0) || (c1 == 3 && ((main_info.num_mouse_buttons == 3 && mouse.but3 == 0) || (main_info.num_mouse_buttons == 2 && mouse.but1 == 0 && mouse.but2 == 0)))) {
+                               if ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 0) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 0) || (c1 == 2 && key_pressed(KEY_PL3_JUMP) == 0) || (c1 == 3 && key_pressed(KEY_PL4_JUMP) == 0)) {
                                        if (player[c1].y_add < 0) {
                                                player[c1].y_add += 32768;
                                                if (player[c1].y_add > 0)
@@ -143,7 +144,7 @@ char menu(void)
                                                        player[c1].frame_tick = 0;
                                                        player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
                                                }
-                                               if ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 0) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 0) || (c1 == 2 && joy.but1 == 0) || (c1 == 3 && ((main_info.num_mouse_buttons == 3 && mouse.but3 == 0) || (main_info.num_mouse_buttons == 2 && mouse.but1 == 0 && mouse.but2 == 0))))
+                                               if ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 0) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 0) || (c1 == 2 && key_pressed(KEY_PL3_JUMP) == 0) || (c1 == 3 && key_pressed(KEY_PL4_JUMP) == 0))
                                                        player[c1].jump_ready = 1;
                                        }
                                }
@@ -159,7 +160,7 @@ char menu(void)
                                        }
                                }
                        } else {
-                               if ((c1 == 0 && key_pressed(KEY_PL1_LEFT) == 1 && key_pressed(KEY_PL1_RIGHT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_LEFT) == 1 && key_pressed(KEY_PL2_RIGHT) == 1) || (c1 == 2 && joy.x < -512 && joy.x > 512) || (c1 == 3 && mouse.but1 == 1 && mouse.but2 == 1)) {
+                               if ((c1 == 0 && key_pressed(KEY_PL1_LEFT) == 1 && key_pressed(KEY_PL1_RIGHT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_LEFT) == 1 && key_pressed(KEY_PL2_RIGHT) == 1) || (c1 == 2 && key_pressed(KEY_PL3_LEFT) == 1 && key_pressed(KEY_PL3_RIGHT) == 1) || (c1 == 3 && key_pressed(KEY_PL4_LEFT) == 1 && key_pressed(KEY_PL4_RIGHT) == 1)) {
                                        if (player[c1].direction == 1) {
                                                if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
                                                        if (player[c1].x_add > 0) {
@@ -213,7 +214,7 @@ char menu(void)
                                                        player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
                                                }
                                        }
-                               } else if ((c1 == 0 && key_pressed(KEY_PL1_LEFT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_LEFT) == 1) || (c1 == 2 && joy.x < -512) || (c1 == 3 && mouse.but1 == 1)) {
+                               } else if ((c1 == 0 && key_pressed(KEY_PL1_LEFT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_LEFT) == 1) || (c1 == 2 && key_pressed(KEY_PL3_LEFT) == 1) || (c1 == 3 && key_pressed(KEY_PL4_LEFT) == 1)) {
                                        if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
                                                if (player[c1].x_add > 0) {
                                                        player[c1].x_add -= 16384;
@@ -239,7 +240,7 @@ char menu(void)
                                                player[c1].frame_tick = 0;
                                                player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
                                        }
-                               } else if ((c1 == 0 && key_pressed(KEY_PL1_RIGHT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_RIGHT) == 1) || (c1 == 2 && joy.x > 512) || (c1 == 3 && mouse.but2 == 1)) {
+                               } else if ((c1 == 0 && key_pressed(KEY_PL1_RIGHT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_RIGHT) == 1) || (c1 == 2 && key_pressed(KEY_PL3_RIGHT) == 1) || (c1 == 3 && key_pressed(KEY_PL4_RIGHT) == 1)) {
                                        if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
                                                if (player[c1].x_add < 0) {
                                                        player[c1].x_add += 16384;
@@ -299,7 +300,7 @@ char menu(void)
                                                player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
                                        }
                                }
-                               if (player[c1].jump_ready == 1 && ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 1) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 1) || (c1 == 2 && joy.but1 == 1) || (c1 == 3 && ((main_info.num_mouse_buttons == 3 && mouse.but3 == 1) || (main_info.num_mouse_buttons == 2 && mouse.but1 == 1 && mouse.but2 == 1))))) {
+                               if (player[c1].jump_ready == 1 && ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 1) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 1) || (c1 == 2 && key_pressed(KEY_PL3_JUMP) == 1) || (c1 == 3 && key_pressed(KEY_PL4_JUMP) == 1))) {
                                        if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
                                                if ((player[c1].y >> 16) >= (160 + c1 * 2)) {
                                                        player[c1].y_add = -280000L;
@@ -322,14 +323,14 @@ char menu(void)
                                                }
                                        }
                                }
-                               if ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 0) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 0) || (c1 == 2 && joy.but1 == 0) || (c1 == 3 && ((main_info.num_mouse_buttons == 3 && mouse.but3 == 0) || (main_info.num_mouse_buttons == 2 && mouse.but1 == 0 && mouse.but2 == 0)))) {
+                               if ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 0) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 0) || (c1 == 2 && key_pressed(KEY_PL3_JUMP) == 0) || (c1 == 3 && key_pressed(KEY_PL4_JUMP) == 0)) {
                                        if (player[c1].y_add < 0) {
                                                player[c1].y_add += 32768;
                                                if (player[c1].y_add > 0)
                                                        player[c1].y_add = 0;
                                        }
                                }
-                               if ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 0) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 0) || (c1 == 2 && joy.but1 == 0) || (c1 == 3 && ((main_info.num_mouse_buttons == 3 && mouse.but3 == 0) || (main_info.num_mouse_buttons == 2 && (mouse.but1 == 0 || mouse.but2 == 0)))))
+                               if ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 0) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 0) || (c1 == 2 && key_pressed(KEY_PL3_JUMP) == 0) || (c1 == 3 && key_pressed(KEY_PL4_JUMP) == 0))
                                        player[c1].jump_ready = 1;
                                player[c1].y_add += 12288;
                                if (player[c1].y_add > 36864 && player[c1].anim != 3) {
@@ -445,9 +446,13 @@ char menu(void)
                                }
                                fade_count++;
                        } else {
+/*
                                outportw(0x3c4, 0x0f02);
                                memset((char *) (0xa0000 + 220 * 100 + __djgpp_conventional_base), 0, 2000);
                                memset((char *) (0xa0000 + 32768 + 220 * 100 + __djgpp_conventional_base), 0, 2000);
+                               /* clear 5 lines at x=0,y=220 in front and backbuffer */
+                               */memset((void *) get_vgaptr(0, 0, 220), 0, 8000);
+
                                cur_message++;
                                if (cur_message >= NUM_MESSAGES)
                                        cur_message -= NUM_MESSAGES;
@@ -481,23 +486,25 @@ char menu(void)
                main_info.draw_page ^= 1;
                main_info.view_page ^= 1;
 
+#ifndef LINUX
                outportw(0x3d4, (main_info.view_page << 23) + 0x0d);
                outportw(0x3d4, ((main_info.view_page << 15) & 0xff00) + 0x0c);
+#else
+               flippage(main_info.view_page);
+#endif
 
+/*
                while ((inportb(0x3da) & 8) == 0)
                        dj_mix();
                while ((inportb(0x3da) & 8) == 8)
                        dj_mix();
+*/
 
                if (fade_flag != 0) {
-                       outportb(0x3c8, 0);
-                       for (c1 = 0; c1 < 720; c1++)
-                               outportb(0x3c9, menu_cur_pal[c1]);
+                       setpalette(0, 240, menu_cur_pal);
                }
 
-               outportb(0x3c8, 240);
-               for (c1 = 0; c1 < 48; c1++)
-                       outportb(0x3c9, fade_pal[c1]);
+               setpalette(240, 16, fade_pal);
 
                dj_mix();
 
@@ -516,9 +523,7 @@ char menu_init(void)
        FILE *handle;
        int c1;
 
-       outportb(0x3c8, 0);
-       for (c1 = 0; c1 < 768; c1++)
-               outportb(0x3c9, 0);
+       fillpalette(0, 0, 0);
 
        if ((handle = dat_open("menu.pcx", datfile_name, "rb")) == 0) {
                strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
@@ -570,7 +575,5 @@ char menu_init(void)
 
 void menu_deinit(void)
 {
-
        dj_set_nosound(1);
-
 }