/***********************************************************
-* Rocks'n'Diamonds -- McDuffin Strikes Back! *
+* Rocks'n'Diamonds -- McDuffin Strikes Back! *
*----------------------------------------------------------*
-* (c) 1995-98 Artsoft Entertainment *
-* Holger Schemel *
-* Oststrasse 11a *
-* 33604 Bielefeld *
-* phone: ++49 +521 290471 *
-* email: aeglos@valinor.owl.de *
+* (c) 1995-2001 Artsoft Entertainment *
+* Holger Schemel *
+* Detmolder Strasse 189 *
+* 33604 Bielefeld *
+* Germany *
+* e-mail: info@artsoft.org *
*----------------------------------------------------------*
-* tools.c *
+* tools.c *
***********************************************************/
+#if 0
#include <stdarg.h>
#if defined(PLATFORM_FREEBSD)
#include <machine/joystick.h>
#endif
+#endif
#include "libgame/libgame.h"
#include "tools.h"
#include "game.h"
#include "events.h"
-#include "joystick.h"
#include "cartoons.h"
#include "network.h"
#include "tape.h"
void BackToFront()
{
int x,y;
- DrawBuffer buffer = (drawto_field == window ? backbuffer : drawto_field);
+ DrawBuffer *buffer = (drawto_field == window ? backbuffer : drawto_field);
if (setup.direct_draw && game_status == PLAYING)
redraw_mask &= ~REDRAW_MAIN;
if (Store[last_jx][last_jy] && IS_DRAWABLE(last_element))
{
DrawLevelElement(last_jx, last_jy, Store[last_jx][last_jy]);
- DrawLevelFieldThruMask(last_jx, last_jy);
+ if (last_element == EL_DYNAMITE_ACTIVE)
+ DrawDynamite(last_jx, last_jy);
+ else
+ DrawLevelFieldThruMask(last_jx, last_jy);
}
else if (last_element == EL_DYNAMITE_ACTIVE)
DrawDynamite(last_jx, last_jy);
DrawLevelElement(jx, jy, Store[jx][jy]);
else if (!IS_ACTIVE_BOMB(element))
DrawLevelField(jx, jy);
+ else
+ DrawLevelElement(jx, jy, EL_LEERRAUM);
/* draw player himself */
MarkTileDirty(x,y);
}
-void DrawGraphicExt(DrawBuffer bitmap, int x, int y, int graphic)
+void DrawGraphicExt(DrawBuffer *bitmap, int x, int y, int graphic)
{
int bitmap_nr;
int src_x, src_y;
MarkTileDirty(x,y);
}
-void DrawGraphicThruMaskExt(DrawBuffer d, int dest_x, int dest_y, int graphic)
+void DrawGraphicThruMaskExt(DrawBuffer *d, int dest_x, int dest_y, int graphic)
{
int tile = graphic;
int bitmap_nr;
int src_x, src_y;
- Bitmap src_bitmap;
+ Bitmap *src_bitmap;
GC drawing_gc;
if (graphic == GFX_LEERRAUM)
MarkTileDirty(x/2, y/2);
}
-void getMiniGraphicSource(int graphic, Bitmap *bitmap, int *x, int *y)
+void getMiniGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y)
{
if (graphic >= GFX_START_ROCKSSCREEN && graphic <= GFX_END_ROCKSSCREEN)
{
}
}
-void DrawMiniGraphicExt(DrawBuffer d, int x, int y, int graphic)
+void DrawMiniGraphicExt(DrawBuffer *d, int x, int y, int graphic)
{
- Bitmap bitmap;
+ Bitmap *bitmap;
int src_x, src_y;
getMiniGraphicSource(graphic, &bitmap, &src_x, &src_y);
int src_x, src_y, dest_x, dest_y;
int tile = graphic;
int bitmap_nr;
- Bitmap src_bitmap;
+ Bitmap *src_bitmap;
GC drawing_gc;
if (graphic < 0)
else if ((element == EL_FELSBROCKEN ||
element == EL_SP_ZONK ||
element == EL_BD_ROCK ||
- IS_GEM(element)) && !cut_mode)
+ element == EL_SP_INFOTRON ||
+ IS_GEM(element))
+ && !cut_mode)
{
if (uy >= lev_fieldy-1 || !IS_BELT(Feld[ux][uy+1]))
{
}
}
else if (element == EL_MAGIC_WALL_EMPTY ||
+ element == EL_MAGIC_WALL_EMPTYING ||
element == EL_MAGIC_WALL_BD_EMPTY ||
+ element == EL_MAGIC_WALL_BD_EMPTYING ||
element == EL_MAGIC_WALL_FULL ||
element == EL_MAGIC_WALL_BD_FULL)
{
graphic += 3 + getGraphicAnimationPhase(4, 4, ANIM_REVERSE);
}
- else if (IS_AMOEBOID(element))
+ else if (IS_AMOEBOID(element) || element == EL_AMOEBA_DRIPPING)
{
graphic = (element == EL_AMOEBE_TOT ? GFX_AMOEBE_TOT : GFX_AMOEBE_LEBT);
graphic += (x + 2 * y + 4) % 4;
void DrawScreenField(int x, int y)
{
int ux = LEVELX(x), uy = LEVELY(y);
- int element;
+ int element, content;
if (!IN_LEV_FIELD(ux, uy))
{
}
element = Feld[ux][uy];
+ content = Store[ux][uy];
if (IS_MOVING(ux, uy))
{
int horiz_move = (MovDir[ux][uy] == MV_LEFT || MovDir[ux][uy] == MV_RIGHT);
boolean cut_mode = NO_CUTTING;
- if (Store[ux][uy] == EL_MORAST_LEER ||
- Store[ux][uy] == EL_MAGIC_WALL_EMPTY ||
- Store[ux][uy] == EL_MAGIC_WALL_BD_EMPTY ||
- Store[ux][uy] == EL_AMOEBE_NASS)
+ if (element == EL_QUICKSAND_EMPTYING ||
+ element == EL_MAGIC_WALL_EMPTYING ||
+ element == EL_MAGIC_WALL_BD_EMPTYING ||
+ element == EL_AMOEBA_DRIPPING)
cut_mode = CUT_ABOVE;
- else if (Store[ux][uy] == EL_MORAST_VOLL ||
- Store[ux][uy] == EL_MAGIC_WALL_FULL ||
- Store[ux][uy] == EL_MAGIC_WALL_BD_FULL)
+ else if (element == EL_QUICKSAND_FILLING ||
+ element == EL_MAGIC_WALL_FILLING ||
+ element == EL_MAGIC_WALL_BD_FILLING)
cut_mode = CUT_BELOW;
if (cut_mode == CUT_ABOVE)
- DrawScreenElementShifted(x, y, 0, 0, Store[ux][uy], NO_CUTTING);
+ DrawScreenElementShifted(x, y, 0, 0, element, NO_CUTTING);
else
DrawScreenElement(x, y, EL_LEERRAUM);
if (horiz_move)
DrawScreenElementShifted(x, y, MovPos[ux][uy], 0, element, NO_CUTTING);
- else
+ else if (cut_mode == NO_CUTTING)
DrawScreenElementShifted(x, y, 0, MovPos[ux][uy], element, cut_mode);
+ else
+ DrawScreenElementShifted(x, y, 0, MovPos[ux][uy], content, cut_mode);
- if (Store[ux][uy] == EL_SALZSAEURE)
+ if (content == EL_SALZSAEURE)
DrawLevelElementThruMask(ux, uy + 1, EL_SALZSAEURE);
}
else if (IS_BLOCKED(ux, uy))
int sx, sy;
int horiz_move;
boolean cut_mode = NO_CUTTING;
+ int element_old, content_old;
Blocked2Moving(ux, uy, &oldx, &oldy);
sx = SCREENX(oldx);
horiz_move = (MovDir[oldx][oldy] == MV_LEFT ||
MovDir[oldx][oldy] == MV_RIGHT);
- if (Store[oldx][oldy] == EL_MORAST_LEER ||
- Store[oldx][oldy] == EL_MAGIC_WALL_EMPTY ||
- Store[oldx][oldy] == EL_MAGIC_WALL_BD_EMPTY ||
- Store[oldx][oldy] == EL_AMOEBE_NASS)
+ element_old = Feld[oldx][oldy];
+ content_old = Store[oldx][oldy];
+
+ if (element_old == EL_QUICKSAND_EMPTYING ||
+ element_old == EL_MAGIC_WALL_EMPTYING ||
+ element_old == EL_MAGIC_WALL_BD_EMPTYING ||
+ element_old == EL_AMOEBA_DRIPPING)
cut_mode = CUT_ABOVE;
DrawScreenElement(x, y, EL_LEERRAUM);
- element = Feld[oldx][oldy];
if (horiz_move)
- DrawScreenElementShifted(sx,sy, MovPos[oldx][oldy],0,element,NO_CUTTING);
+ DrawScreenElementShifted(sx, sy, MovPos[oldx][oldy], 0, element_old,
+ NO_CUTTING);
+ else if (cut_mode == NO_CUTTING)
+ DrawScreenElementShifted(sx, sy, 0, MovPos[oldx][oldy], element_old,
+ cut_mode);
else
- DrawScreenElementShifted(sx,sy, 0,MovPos[oldx][oldy],element,cut_mode);
+ DrawScreenElementShifted(sx, sy, 0, MovPos[oldx][oldy], content_old,
+ cut_mode);
}
else if (IS_DRAWABLE(element))
DrawScreenElement(x, y, element);
for(x=start; x<=DXSIZE; x+=stepsize)
{
- Bitmap bitmap = pix[PIX_DOOR];
+ Bitmap *bitmap = pix[PIX_DOOR];
GC gc = bitmap->stored_clip_gc;
WaitUntilDelayReached(&door_delay, door_delay_value);
}
#ifndef TARGET_SDL
-int ReadPixel(DrawBuffer bitmap, int x, int y)
+int ReadPixel(DrawBuffer *bitmap, int x, int y)
{
XImage *pixel_image;
unsigned long pixel_value;
}
};
-#if 0
-static void DoNotDisplayInfoText(void *ptr)
-{
- return;
-}
-#endif
-
void CreateToolButtons()
{
int i;
for (i=0; i<NUM_TOOL_BUTTONS; i++)
{
- Bitmap gd_bitmap = pix[PIX_DOOR];
- Bitmap deco_bitmap = None;
+ Bitmap *gd_bitmap = pix[PIX_DOOR];
+ Bitmap *deco_bitmap = None;
int deco_x = 0, deco_y = 0, deco_xpos = 0, deco_ypos = 0;
struct GadgetInfo *gi;
unsigned long event_mask;
GDI_DECORATION_SIZE, MINI_TILEX, MINI_TILEY,
GDI_DECORATION_SHIFTING, 1, 1,
GDI_EVENT_MASK, event_mask,
-
-#if 0
- GDI_CALLBACK_INFO, DoNotDisplayInfoText,
-#endif
-
GDI_CALLBACK_ACTION, HandleToolButtons,
GDI_END);
request_gadget_id = gi->custom_id;
}
+int get_next_element(int element)
+{
+ switch(element)
+ {
+ case EL_QUICKSAND_FILLING: return EL_MORAST_VOLL;
+ case EL_QUICKSAND_EMPTYING: return EL_MORAST_LEER;
+ case EL_MAGIC_WALL_FILLING: return EL_MAGIC_WALL_FULL;
+ case EL_MAGIC_WALL_EMPTYING: return EL_MAGIC_WALL_EMPTY;
+ case EL_MAGIC_WALL_BD_FILLING: return EL_MAGIC_WALL_BD_FULL;
+ case EL_MAGIC_WALL_BD_EMPTYING: return EL_MAGIC_WALL_BD_EMPTY;
+ case EL_AMOEBA_DRIPPING: return EL_AMOEBE_NASS;
+
+ default: return element;
+ }
+}
+
int el2gfx(int element)
{
switch(element)
case EL_DIAMANT: return GFX_DIAMANT;
case EL_MORAST_LEER: return GFX_MORAST_LEER;
case EL_MORAST_VOLL: return GFX_MORAST_VOLL;
+ case EL_QUICKSAND_EMPTYING: return GFX_MORAST_LEER;
case EL_TROPFEN: return GFX_TROPFEN;
case EL_BOMBE: return GFX_BOMBE;
case EL_MAGIC_WALL_OFF: return GFX_MAGIC_WALL_OFF;
case EL_MAGIC_WALL_EMPTY: return GFX_MAGIC_WALL_EMPTY;
+ case EL_MAGIC_WALL_EMPTYING:return GFX_MAGIC_WALL_EMPTY;
case EL_MAGIC_WALL_FULL: return GFX_MAGIC_WALL_FULL;
case EL_MAGIC_WALL_DEAD: return GFX_MAGIC_WALL_DEAD;
case EL_SALZSAEURE: return GFX_SALZSAEURE;
case EL_AMOEBE_VOLL: return GFX_AMOEBE_VOLL;
case EL_AMOEBE_BD: return GFX_AMOEBE_BD;
case EL_AMOEBA2DIAM: return GFX_AMOEBA2DIAM;
+ case EL_AMOEBA_DRIPPING: return GFX_AMOEBE_NASS;
case EL_KOKOSNUSS: return GFX_KOKOSNUSS;
case EL_LIFE: return GFX_LIFE;
case EL_LIFE_ASYNC: return GFX_LIFE_ASYNC;
case EL_MAMPFER2: return GFX_MAMPFER2;
case EL_MAGIC_WALL_BD_OFF: return GFX_MAGIC_WALL_BD_OFF;
case EL_MAGIC_WALL_BD_EMPTY:return GFX_MAGIC_WALL_BD_EMPTY;
+ case EL_MAGIC_WALL_BD_EMPTYING:return GFX_MAGIC_WALL_BD_EMPTY;
case EL_MAGIC_WALL_BD_FULL: return GFX_MAGIC_WALL_BD_FULL;
case EL_MAGIC_WALL_BD_DEAD: return GFX_MAGIC_WALL_BD_DEAD;
case EL_DYNABOMB_ACTIVE_1: return GFX_DYNABOMB;