NEW: games/devilutionx

classic Classic list List threaded Threaded
9 messages Options
Reply | Threaded
Open this post in threaded view
|

NEW: games/devilutionx

Brian Callahan-5
Hi ports --

Attached is a new port, games/devilutionx. DevilutionX is an open source
engine recreation for the original Diablo I game.

---
pkg/DESCR:
DevilutionX is an open source recreation of the game engine used in
Diablo I, an action role-playing game by Blizzard Entertainment.

While this package and the game engine are open source, one still needs
to provide the original game assets from Diablo I, which is not open
source. You will need to purchase the original game to use this package.
---

This port is a multi-person effort between myself, thfr@, and brynet@.
The game works very well on amd64--the underlying engine is claimed to
be nearly 100% binary identical to the original game. Sadly, multiplayer
doesn't work on 64-bit platforms, but this is known and hopefully will
be fixed at some point.

OK?

~Brian


devilutionx.tgz (6K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: NEW: games/devilutionx

Nam Nguyen
Brian Callahan writes:

> Hi ports --
>
> Attached is a new port, games/devilutionx. DevilutionX is an open
> source engine recreation for the original Diablo I game.

Minor nit: pkg/README path should be ~/.local/share/diasurgical/devilution/

>
> ---
> pkg/DESCR:
> DevilutionX is an open source recreation of the game engine used in
> Diablo I, an action role-playing game by Blizzard Entertainment.
>
> While this package and the game engine are open source, one still needs
> to provide the original game assets from Diablo I, which is not open
> source. You will need to purchase the original game to use this package.
> ---
>
> This port is a multi-person effort between myself, thfr@, and
> brynet@.
Thank you for all of your work. I had a lot of fun poking at it to get
TCP multiplayer to work.

> The game works very well on amd64--the underlying engine is
> claimed to be nearly 100% binary identical to the original
> game. Sadly, multiplayer doesn't work on 64-bit platforms, but this is
> known and hopefully will be fixed at some point.

I opened an issue upstream for 64-bit
multiplayer. https://github.com/diasurgical/devilutionX/issues/191

I managed to get 0.4.0 to work with TCP multiplayer on amd64. I have
attached it here in case you want to test against it.

The two main diffs are:
* patch-SourceX_dvlnet_frame_queue_cpp
* patch-Source_msg_cpp

These deal with 64-bit issues. In particular, msg.cpp cleans up some
pointer arithmetic where there happened to be padding. frame_queue.cpp
copies from a 32-bit type to a 64-bit type.

These diffs have to be removed when building for i386, so perhaps some
macros and platform detection need to be added.

I briefly tried merging my work against the git version, but I ran into
a segfault and haven't had time to investigate a possible regression.

Testing should focus on the git head version that you posted, and you
should have the final say on 0.4.0 vs git head. Git head has had many
fixes.

In testing the git head version:

amd64:
* TCP dialog box saying "unable to create game"
* UDP terminating with uncaught exception of type
std::__1::system_error: send_to: Socket is already connected

i386:
* TCP player 2 successfully connects to player 1
* UDP same socket error

>
> OK?
>
> ~Brian


devilutionx-0.4.0.tar.gz (8K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: NEW: games/devilutionx

Brian Callahan-5
Hi Nam --

On 7/19/19 4:45 AM, Nam Nguyen wrote:

>
> I opened an issue upstream for 64-bit
> multiplayer. https://github.com/diasurgical/devilutionX/issues/191
>
> I managed to get 0.4.0 to work with TCP multiplayer on amd64. I have
> attached it here in case you want to test against it.
>
> The two main diffs are:
> * patch-SourceX_dvlnet_frame_queue_cpp
> * patch-Source_msg_cpp
>
> These deal with 64-bit issues. In particular, msg.cpp cleans up some
> pointer arithmetic where there happened to be padding. frame_queue.cpp
> copies from a 32-bit type to a 64-bit type.
>
> These diffs have to be removed when building for i386, so perhaps some
> macros and platform detection need to be added.
>
> I briefly tried merging my work against the git version, but I ran into
> a segfault and haven't had time to investigate a possible regression.
>
> Testing should focus on the git head version that you posted, and you
> should have the final say on 0.4.0 vs git head. Git head has had many
> fixes.

We'll sync with releases starting with the next release (presumable 0.5).

~Brian

> In testing the git head version:
>
> amd64:
> * TCP dialog box saying "unable to create game"
> * UDP terminating with uncaught exception of type
> std::__1::system_error: send_to: Socket is already connected
>
> i386:
> * TCP player 2 successfully connects to player 1
> * UDP same socket error
>

Reply | Threaded
Open this post in threaded view
|

Re: NEW: games/devilutionx

Bryan Steele-2
In reply to this post by Brian Callahan-5
On Thu, Jul 18, 2019 at 07:49:51PM -0400, Brian Callahan wrote:

> Hi ports --
>
> Attached is a new port, games/devilutionx. DevilutionX is an open source
> engine recreation for the original Diablo I game.
>
> ---
> pkg/DESCR:
> DevilutionX is an open source recreation of the game engine used in
> Diablo I, an action role-playing game by Blizzard Entertainment.
>
> While this package and the game engine are open source, one still needs
> to provide the original game assets from Diablo I, which is not open
> source. You will need to purchase the original game to use this package.
> ---
>
> This port is a multi-person effort between myself, thfr@, and brynet@. The
> game works very well on amd64--the underlying engine is claimed to be nearly
> 100% binary identical to the original game. Sadly, multiplayer doesn't work
> on 64-bit platforms, but this is known and hopefully will be fixed at some
> point.
>
> OK?
>
> ~Brian

I'm obviously ok with this going in, w/ the pkg/README fix from Nam. :-)

It's unfortunate that we will initially miss out on multiplayer support,
but good that someone is working on the problem, and upstream is aware.

Hopefully some of these changes can be sent upstream.

-Bryan.

Reply | Threaded
Open this post in threaded view
|

Re: NEW: games/devilutionx

Bryan Steele-2
On Fri, Jul 19, 2019 at 10:37:59AM -0400, Bryan Steele wrote:

> On Thu, Jul 18, 2019 at 07:49:51PM -0400, Brian Callahan wrote:
> > Hi ports --
> >
> > Attached is a new port, games/devilutionx. DevilutionX is an open source
> > engine recreation for the original Diablo I game.
> >
> > ---
> > pkg/DESCR:
> > DevilutionX is an open source recreation of the game engine used in
> > Diablo I, an action role-playing game by Blizzard Entertainment.
> >
> > While this package and the game engine are open source, one still needs
> > to provide the original game assets from Diablo I, which is not open
> > source. You will need to purchase the original game to use this package.
> > ---
> >
> > This port is a multi-person effort between myself, thfr@, and brynet@. The
> > game works very well on amd64--the underlying engine is claimed to be nearly
> > 100% binary identical to the original game. Sadly, multiplayer doesn't work
> > on 64-bit platforms, but this is known and hopefully will be fixed at some
> > point.
> >
> > OK?
> >
> > ~Brian
>
> I'm obviously ok with this going in, w/ the pkg/README fix from Nam. :-)
>
> It's unfortunate that we will initially miss out on multiplayer support,
> but good that someone is working on the problem, and upstream is aware.
>
> Hopefully some of these changes can be sent upstream.
>
> -Bryan.

To those of you following along, this is the port that thfr@ used when
streaming Diablo last month on OpenBSD.

https://www.youtube.com/watch?v=5sBKaqkFev8

Reply | Threaded
Open this post in threaded view
|

Re: NEW: games/devilutionx

Nam Nguyen
amd64 multiplayer now works. Here is a diff for the git version as of
July 19, 2019 from this commit
(https://github.com/diasurgical/devilutionX/commit/72f65d577124d24ab9f459ef164e31c9ab225b3e).

I added __LP64__ for amd64 specific bits, allowing it to compile on both
amd64 and i386. Bryan suggested, "You could probably do #ifdef __i386__
or __amd64__ or more generally, #ifdef __LP64__ I suspect there may be a
way to fix it so the code works on both 32-bit and 64-bit platforms,
however."

To test I connected to a game hosted by Bryan, and we played the first
several rooms in the first dungeon. Also, I was able to build and play
from i386 and amd64 in the same game.

Brian Callahan writes:
> We'll sync with releases starting with the next release (presumable
> 0.5).

I have communicated my findings with upstream
(https://github.com/diasurgical/devilutionX/issues/191). Multiplayer
testing is a priority for the next release.

This diff is pasted for consideration in ports, in case multiplayer is
desired before the next release. Tests and feedback are welcome. Thank
you to all involved in this port.

Bryan Steele writes:

> On Fri, Jul 19, 2019 at 10:37:59AM -0400, Bryan Steele wrote:
>> On Thu, Jul 18, 2019 at 07:49:51PM -0400, Brian Callahan wrote:
>> > Hi ports --
>> >
>> > Attached is a new port, games/devilutionx. DevilutionX is an open source
>> > engine recreation for the original Diablo I game.
>> >
>> > ---
>> > pkg/DESCR:
>> > DevilutionX is an open source recreation of the game engine used in
>> > Diablo I, an action role-playing game by Blizzard Entertainment.
>> >
>> > While this package and the game engine are open source, one still needs
>> > to provide the original game assets from Diablo I, which is not open
>> > source. You will need to purchase the original game to use this package.
>> > ---
>> >
>> > This port is a multi-person effort between myself, thfr@, and brynet@. The
>> > game works very well on amd64--the underlying engine is claimed to be nearly
>> > 100% binary identical to the original game. Sadly, multiplayer doesn't work
>> > on 64-bit platforms, but this is known and hopefully will be fixed at some
>> > point.
>> >
>> > OK?
>> >
>> > ~Brian
>>
>> I'm obviously ok with this going in, w/ the pkg/README fix from Nam. :-)
>>
>> It's unfortunate that we will initially miss out on multiplayer support,
>> but good that someone is working on the problem, and upstream is aware.
>>
>> Hopefully some of these changes can be sent upstream.
>>
>> -Bryan.
>
> To those of you following along, this is the port that thfr@ used when
> streaming Diablo last month on OpenBSD.
>
> https://www.youtube.com/watch?v=5sBKaqkFev8

Index: Makefile
===================================================================
RCS file: /cvs/ports/games/devilutionx/Makefile,v
retrieving revision 1.1.1.1
diff -u -p -u -p -r1.1.1.1 Makefile
--- Makefile 19 Jul 2019 13:42:33 -0000 1.1.1.1
+++ Makefile 24 Jul 2019 01:53:09 -0000
@@ -1,12 +1,12 @@
 # $OpenBSD: Makefile,v 1.1.1.1 2019/07/19 13:42:33 bcallah Exp $
 
 COMMENT = open source engine recreation for Diablo 1 game
-DISTNAME = devilutionx-0.4.0pl20190715
+DISTNAME = devilutionx-0.4.0pl20190723
 CATEGORIES = games x11
 
 GH_ACCOUNT = diasurgical
 GH_PROJECT = devilutionX
-GH_COMMIT = 10ebca4efd422bbf46bad6d12ea4cdade9038b01
+GH_COMMIT = 72f65d577124d24ab9f459ef164e31c9ab225b3e
 
 MAINTAINER = Brian Callahan <[hidden email]>
 
Index: distinfo
===================================================================
RCS file: /cvs/ports/games/devilutionx/distinfo,v
retrieving revision 1.1.1.1
diff -u -p -u -p -r1.1.1.1 distinfo
--- distinfo 19 Jul 2019 13:42:33 -0000 1.1.1.1
+++ distinfo 24 Jul 2019 01:53:09 -0000
@@ -1,2 +1,2 @@
-SHA256 (devilutionx-0.4.0pl20190715-10ebca4e.tar.gz) = 6WOyN6WpRoYuKpe1P24YgQ8OaYEtShyt8p1R8JrZT4U=
-SIZE (devilutionx-0.4.0pl20190715-10ebca4e.tar.gz) = 1350054
+SHA256 (devilutionx-0.4.0pl20190723-72f65d57.tar.gz) = 13YESHQhAY4y15I8OKjjoyf6pxMEJSCeot84/Qs3Cxg=
+SIZE (devilutionx-0.4.0pl20190723-72f65d57.tar.gz) = 1354368
Index: patches/patch-CMakeLists_txt
===================================================================
RCS file: /cvs/ports/games/devilutionx/patches/patch-CMakeLists_txt,v
retrieving revision 1.1.1.1
diff -u -p -u -p -r1.1.1.1 patch-CMakeLists_txt
--- patches/patch-CMakeLists_txt 19 Jul 2019 13:42:33 -0000 1.1.1.1
+++ patches/patch-CMakeLists_txt 24 Jul 2019 01:53:09 -0000
@@ -14,7 +14,7 @@ Index: CMakeLists.txt
    set(ASAN OFF)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DO_LARGEFILE=0 -Dstat64=stat -Dlstat64=lstat -Dlseek64=lseek -Doff64_t=off_t -Dfstat64=fstat -Dftruncate64=ftruncate")
  endif()
-@@ -289,7 +289,7 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+@@ -290,7 +290,7 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
    # Silence warnings about __int64 alignment hack not always being applicable
    target_compile_options(devilutionx PRIVATE -Wno-ignored-attributes)
    # Fix: error: cast from pointer to smaller type 'unsigned char' loses information
Index: patches/patch-SourceX_dvlnet_frame_queue_cpp
===================================================================
RCS file: patches/patch-SourceX_dvlnet_frame_queue_cpp
diff -N patches/patch-SourceX_dvlnet_frame_queue_cpp
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-SourceX_dvlnet_frame_queue_cpp 24 Jul 2019 01:53:09 -0000
@@ -0,0 +1,24 @@
+$OpenBSD$
+
+nextsize is 8 bytes. framesize_t is 4 bytes. Copy framesize_t to
+nextsize then shift 32 bits to zero out the most significant 32
+bits. This fixes packet_ready().
+
+Remove this patch when building for i386 (32-bit).
+
+Index: SourceX/dvlnet/frame_queue.cpp
+--- SourceX/dvlnet/frame_queue.cpp.orig
++++ SourceX/dvlnet/frame_queue.cpp
+@@ -48,7 +48,12 @@ bool frame_queue::packet_ready()
+ if(size() < sizeof(framesize_t))
+ return false;
+ auto szbuf = read(sizeof(framesize_t));
++ #ifdef __LP64__
++ std::memcpy(&nextsize, &szbuf[0], sizeof(framesize_t));
++ nextsize >> 32;
++ #else
+ std::memcpy(&nextsize, &szbuf[0], sizeof(nextsize));
++ #endif
+ if(!nextsize)
+ throw frame_queue_exception();
+ }
Index: patches/patch-Source_list_h
===================================================================
RCS file: patches/patch-Source_list_h
diff -N patches/patch-Source_list_h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-Source_list_h 24 Jul 2019 01:53:09 -0000
@@ -0,0 +1,14 @@
+$OpenBSD$
+
+Index: Source/list.h
+--- Source/list.h.orig
++++ Source/list.h
+@@ -154,7 +154,7 @@ void TList<T>::UnlinkAll()
+ {
+ for (;;) {
+ T *node = m_link.Next();
+- if ((int)node <= 0)
++ if ((uintptr_t)node <= 0)
+ break;
+ node->m_Link.Unlink();
+ }
Index: patches/patch-Source_msg_cpp
===================================================================
RCS file: patches/patch-Source_msg_cpp
diff -N patches/patch-Source_msg_cpp
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-Source_msg_cpp 24 Jul 2019 01:53:09 -0000
@@ -0,0 +1,44 @@
+$OpenBSD$
+
+This fixes a padding bug.
+
+(char *)&packeta[1] - packeta->dwSpaceLeft doesn't work because it assumes there
+is no padding at the end of TMegaPkt. With padding it started writing a few
+bytes after packeta->data, so the first few bytes were garbage.
+
+The goal is to write to packeta->data at the first available byte, based on
+packeta->dwSpaceLeft. It is safer to calculate starting from packeta->data.
+
+Also, pointers like pNext are 8 bytes long on 64-bit platforms. Should allocate
+8 + 4 + 32000 = 32012.
+
+typedef struct TMegaPkt {^M
+ struct TMegaPkt *pNext;^M
+ DWORD dwSpaceLeft;^M
+ BYTE data[32000];^M
+} TMegaPkt;
+
+Index: Source/msg.cpp
+--- Source/msg.cpp.orig
++++ Source/msg.cpp
+@@ -47,7 +47,7 @@ void msg_send_packet(int pnum, const void *packet, DWO
+ msg_get_next_packet();
+ packeta = sgpCurrPkt;
+ }
+- memcpy((char *)&packeta[1] - packeta->dwSpaceLeft, packet, dwSize);
++ memcpy((char *)(packeta->data + 32000 - packeta->dwSpaceLeft), packet, dwSize);
+ sgpCurrPkt->dwSpaceLeft -= dwSize;
+ }
+
+@@ -55,7 +55,11 @@ TMegaPkt *msg_get_next_packet()
+ {
+ TMegaPkt *result;
+
++ #ifdef __LP64__
++ sgpCurrPkt = (TMegaPkt *)DiabloAllocPtr(32012);
++ #else
+ sgpCurrPkt = (TMegaPkt *)DiabloAllocPtr(32008);
++ #endif
+ sgpCurrPkt->pNext = NULL;
+ sgpCurrPkt->dwSpaceLeft = 32000;
+
Index: patches/patch-Source_nthread_cpp
===================================================================
RCS file: patches/patch-Source_nthread_cpp
diff -N patches/patch-Source_nthread_cpp
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-Source_nthread_cpp 24 Jul 2019 01:53:09 -0000
@@ -0,0 +1,16 @@
+$OpenBSD$
+
+glpMsgTbl stores 64-bit pointers to turn_t variables. This won't fit inside int.
+
+Index: Source/nthread.cpp
+--- Source/nthread.cpp.orig
++++ Source/nthread.cpp
+@@ -11,7 +11,7 @@ static CCritSect sgMemCrit;
+ DWORD gdwDeltaBytesSec;
+ BOOLEAN nthread_should_run;
+ DWORD gdwTurnsInTransit;
+-int glpMsgTbl[MAX_PLRS];
++uintptr_t glpMsgTbl[MAX_PLRS];
+ unsigned int glpNThreadId;
+ char sgbSyncCountdown;
+ int turn_upper_bit;
Index: patches/patch-Source_nthread_h
===================================================================
RCS file: patches/patch-Source_nthread_h
diff -N patches/patch-Source_nthread_h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-Source_nthread_h 24 Jul 2019 01:53:09 -0000
@@ -0,0 +1,16 @@
+$OpenBSD$
+
+glpMsgTbl stores 64-bit pointers to turn_t variables. This won't fit inside int.
+
+Index: Source/nthread.h
+--- Source/nthread.h.orig
++++ Source/nthread.h
+@@ -7,7 +7,7 @@ extern DWORD gdwMsgLenTbl[MAX_PLRS];
+ extern DWORD gdwDeltaBytesSec;
+ extern BOOLEAN nthread_should_run;
+ extern DWORD gdwTurnsInTransit;
+-extern int glpMsgTbl[MAX_PLRS];
++extern uintptr_t glpMsgTbl[MAX_PLRS];
+ extern unsigned int glpNThreadId;
+ extern int turn_upper_bit;
+ extern BOOLEAN sgbThreadIsRunning;
Index: patches/patch-Source_render_cpp
===================================================================
RCS file: /cvs/ports/games/devilutionx/patches/patch-Source_render_cpp,v
retrieving revision 1.1.1.1
diff -u -p -u -p -r1.1.1.1 patch-Source_render_cpp
--- patches/patch-Source_render_cpp 19 Jul 2019 13:42:33 -0000 1.1.1.1
+++ patches/patch-Source_render_cpp 24 Jul 2019 01:53:09 -0000
@@ -5,309 +5,309 @@ clang
 Index: Source/render.cpp
 --- Source/render.cpp.orig
 +++ Source/render.cpp
-@@ -164,7 +164,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
+@@ -161,7 +161,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
  } while (i);
  break;
  case 1: // upper (top transparent), with lighting
-- WorldBoolFlag = (unsigned char)pBuff & 1;
+- WorldBoolFlag = (BYTE)pBuff & 1;
 + WorldBoolFlag = (uintptr_t)pBuff & 1;
  xx_32 = 32;
  do {
  yy_32 = 32;
-@@ -181,7 +181,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
+@@ -178,7 +178,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
  }
  if (dst < gpBufEnd)
  return;
-- if (((unsigned char)dst & 1) == WorldBoolFlag) {
+- if (((BYTE)dst & 1) == WorldBoolFlag) {
 + if (((uintptr_t)dst & 1) == WorldBoolFlag) {
  asm_trans_light_cel_0_2(width, tbl, &dst, &src);
  } else {
  asm_trans_light_cel_1_3(width, tbl, &dst, &src);
-@@ -238,7 +238,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
+@@ -235,7 +235,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
  } else {
  asm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);
  }
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[xx_32 - 800];
+ dst = &dst[xx_32 - (SCREEN_WIDTH + 160)];
  xx_32 -= 2;
  if (xx_32 < 0) {
-@@ -252,7 +252,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
+@@ -249,7 +249,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
  } else {
  asm_trans_light_cel_1_3(32 - yy_32, tbl, &dst, &src);
  }
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[yy_32 - 800];
+ dst = &dst[yy_32 - (SCREEN_WIDTH + 160)];
  yy_32 += 2;
  } while (yy_32 != 32);
-@@ -301,7 +301,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
+@@ -298,7 +298,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
  } else {
  asm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);
  }
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[xx_32 - 800];
+ dst = &dst[xx_32 - (SCREEN_WIDTH + 160)];
  xx_32 -= 2;
  if (xx_32 < 0) {
-@@ -359,7 +359,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
+@@ -356,7 +356,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
  } while (i);
  break;
  case 9: // upper (top transparent), without lighting
-- WorldBoolFlag = (unsigned char)pBuff & 1;
+- WorldBoolFlag = (BYTE)pBuff & 1;
 + WorldBoolFlag = (uintptr_t)pBuff & 1;
  yy_32 = 32;
  LABEL_251:
  xx_32 = 32;
-@@ -383,7 +383,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
+@@ -380,7 +380,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
  xx_32 -= width;
  if (dst < gpBufEnd)
  return;
-- if (((unsigned char)dst & 1) == WorldBoolFlag) {
+- if (((BYTE)dst & 1) == WorldBoolFlag) {
 + if (((uintptr_t)dst & 1) == WorldBoolFlag) {
  chk_sh_and = width >> 1;
  if (!(width & 1))
  goto LABEL_258;
-@@ -775,7 +775,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
+@@ -772,7 +772,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
  } while (i);
  break;
  case 1: // upper (top transparent), black
-- WorldBoolFlag = (unsigned char)pBuff & 1;
+- WorldBoolFlag = (BYTE)pBuff & 1;
 + WorldBoolFlag = (uintptr_t)pBuff & 1;
  xx_32 = 32;
  while (1) {
  yy_32 = 32;
-@@ -788,7 +788,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
+@@ -785,7 +785,7 @@ void drawTopArchesUpperScreen(BYTE *pBuff)
  if (dst < gpBufEnd)
  return;
  src += width;
-- if (((unsigned char)dst & 1) == WorldBoolFlag) {
+- if (((BYTE)dst & 1) == WorldBoolFlag) {
 + if (((uintptr_t)dst & 1) == WorldBoolFlag) {
  chk_sh_and = width >> 1;
  if (!(width & 1))
  goto LABEL_378;
-@@ -1386,7 +1386,7 @@ void drawBottomArchesUpperScreen(BYTE *pBuff, unsigned
+@@ -1381,7 +1381,7 @@ void drawBottomArchesUpperScreen(BYTE *pBuff, DWORD *p
  ++dst;
  --i;
  } while (i);
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst -= 800;
+ dst -= (SCREEN_WIDTH + 160);
  --gpDrawMask;
  --yy_32;
-@@ -1471,7 +1471,7 @@ void drawBottomArchesUpperScreen(BYTE *pBuff, unsigned
+@@ -1466,7 +1466,7 @@ void drawBottomArchesUpperScreen(BYTE *pBuff, DWORD *p
  xx_32 = 30;
  while (dst >= gpBufEnd) {
  asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[xx_32 - 800];
+ dst = &dst[xx_32 - (SCREEN_WIDTH + 160)];
  xx_32 -= 2;
  if (xx_32 < 0) {
-@@ -1480,7 +1480,7 @@ void drawBottomArchesUpperScreen(BYTE *pBuff, unsigned
+@@ -1475,7 +1475,7 @@ void drawBottomArchesUpperScreen(BYTE *pBuff, DWORD *p
  if (dst < gpBufEnd)
  break;
  asm_cel_light_edge(32 - yy_32, tbl, &dst, &src);
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[yy_32 - 800];
+ dst = &dst[yy_32 - (SCREEN_WIDTH + 160)];
  yy_32 += 2;
  } while (yy_32 != 32);
-@@ -1502,7 +1502,7 @@ void drawBottomArchesUpperScreen(BYTE *pBuff, unsigned
+@@ -1497,7 +1497,7 @@ void drawBottomArchesUpperScreen(BYTE *pBuff, DWORD *p
  do {
  if (dst < gpBufEnd)
  break;
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
  asm_trans_light_mask(32, tbl, &dst, &src, *gpDrawMask);
- dst -= 800;
+ dst -= (SCREEN_WIDTH + 160);
  --gpDrawMask;
-@@ -1516,7 +1516,7 @@ void drawBottomArchesUpperScreen(BYTE *pBuff, unsigned
+@@ -1511,7 +1511,7 @@ void drawBottomArchesUpperScreen(BYTE *pBuff, DWORD *p
  xx_32 = 30;
  while (dst >= gpBufEnd) {
  asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[xx_32 - 800];
+ dst = &dst[xx_32 - (SCREEN_WIDTH + 160)];
  xx_32 -= 2;
  if (xx_32 < 0) {
-@@ -1526,7 +1526,7 @@ void drawBottomArchesUpperScreen(BYTE *pBuff, unsigned
+@@ -1521,7 +1521,7 @@ void drawBottomArchesUpperScreen(BYTE *pBuff, DWORD *p
  if (dst < gpBufEnd)
  break;
  asm_trans_light_mask(32, tbl, &dst, &src, *gpDrawMask);
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst -= 800;
+ dst -= (SCREEN_WIDTH + 160);
  --gpDrawMask;
  --yy_32;
-@@ -2107,7 +2107,7 @@ void drawUpperScreen(BYTE *pBuff)
+@@ -2099,7 +2099,7 @@ void drawUpperScreen(BYTE *pBuff)
  xx_32 = 30;
  while (dst >= gpBufEnd) {
  asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[xx_32 - 800];
+ dst = &dst[xx_32 - (SCREEN_WIDTH + 160)];
  xx_32 -= 2;
  if (xx_32 < 0) {
-@@ -2116,7 +2116,7 @@ void drawUpperScreen(BYTE *pBuff)
+@@ -2108,7 +2108,7 @@ void drawUpperScreen(BYTE *pBuff)
  if (dst < gpBufEnd)
  break;
  asm_cel_light_edge(32 - yy_32, tbl, &dst, &src);
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[yy_32 - 800];
+ dst = &dst[yy_32 - (SCREEN_WIDTH + 160)];
  yy_32 += 2;
  } while (yy_32 != 32);
-@@ -2149,7 +2149,7 @@ void drawUpperScreen(BYTE *pBuff)
+@@ -2141,7 +2141,7 @@ void drawUpperScreen(BYTE *pBuff)
  xx_32 = 30;
  while (dst >= gpBufEnd) {
  asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[xx_32 - 800];
+ dst = &dst[xx_32 - (SCREEN_WIDTH + 160)];
  xx_32 -= 2;
  if (xx_32 < 0) {
-@@ -2465,7 +2465,7 @@ void drawTopArchesLowerScreen(BYTE *pBuff)
+@@ -2454,7 +2454,7 @@ void drawTopArchesLowerScreen(BYTE *pBuff)
  } while (i);
  break;
  case 1: // lower (top transparent), black
-- WorldBoolFlag = (unsigned char)pBuff & 1;
+- WorldBoolFlag = (BYTE)pBuff & 1;
 + WorldBoolFlag = (uintptr_t)pBuff & 1;
  xx_32 = 32;
  LABEL_412:
  yy_32 = 32;
-@@ -2489,7 +2489,7 @@ void drawTopArchesLowerScreen(BYTE *pBuff)
+@@ -2478,7 +2478,7 @@ void drawTopArchesLowerScreen(BYTE *pBuff)
  yy_32 -= width;
  if (dst < gpBufEnd) {
  src += width;
-- if (((unsigned char)dst & 1) == WorldBoolFlag) {
+- if (((BYTE)dst & 1) == WorldBoolFlag) {
 + if (((uintptr_t)dst & 1) == WorldBoolFlag) {
  chk_sh_and = width >> 1;
  if (!(width & 1))
  goto LABEL_420;
-@@ -2895,7 +2895,7 @@ void drawTopArchesLowerScreen(BYTE *pBuff)
+@@ -2884,7 +2884,7 @@ void drawTopArchesLowerScreen(BYTE *pBuff)
  } while (i);
  break;
  case 1: // lower (top transparent), with lighting
-- WorldBoolFlag = (unsigned char)pBuff & 1;
+- WorldBoolFlag = (BYTE)pBuff & 1;
 + WorldBoolFlag = (uintptr_t)pBuff & 1;
  xx_32 = 32;
  do {
  yy_32 = 32;
-@@ -2912,7 +2912,7 @@ void drawTopArchesLowerScreen(BYTE *pBuff)
+@@ -2901,7 +2901,7 @@ void drawTopArchesLowerScreen(BYTE *pBuff)
  }
  yy_32 -= width;
  if (dst < gpBufEnd) {
-- if (((unsigned char)dst & 1) == WorldBoolFlag) {
+- if (((BYTE)dst & 1) == WorldBoolFlag) {
 + if (((uintptr_t)dst & 1) == WorldBoolFlag) {
  asm_trans_light_cel_0_2(width, tbl, &dst, &src);
  } else {
  asm_trans_light_cel_1_3(width, tbl, &dst, &src);
-@@ -3011,7 +3011,7 @@ void drawTopArchesLowerScreen(BYTE *pBuff)
+@@ -3000,7 +3000,7 @@ void drawTopArchesLowerScreen(BYTE *pBuff)
  } else {
  asm_trans_light_cel_1_3(32 - yy_32, tbl, &dst, &src);
  }
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[yy_32 - 800];
+ dst = &dst[yy_32 - (SCREEN_WIDTH + 160)];
  yy_32 += 2;
  } while (yy_32 != 32);
-@@ -3031,7 +3031,7 @@ void drawTopArchesLowerScreen(BYTE *pBuff)
+@@ -3020,7 +3020,7 @@ void drawTopArchesLowerScreen(BYTE *pBuff)
  } else {
  asm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);
  }
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[xx_32 - 800];
+ dst = &dst[xx_32 - (SCREEN_WIDTH + 160)];
  xx_32 -= 2;
  } while (xx_32 >= 0);
-@@ -3128,7 +3128,7 @@ void drawTopArchesLowerScreen(BYTE *pBuff)
+@@ -3117,7 +3117,7 @@ void drawTopArchesLowerScreen(BYTE *pBuff)
  } else {
  asm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);
  }
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[xx_32 - 800];
+ dst = &dst[xx_32 - (SCREEN_WIDTH + 160)];
  xx_32 -= 2;
  } while (xx_32 >= 0);
-@@ -3175,7 +3175,7 @@ LABEL_11:
+@@ -3164,7 +3164,7 @@ LABEL_11:
  } while (i);
  break;
  case 9: // lower (top transparent), without lighting
-- WorldBoolFlag = (unsigned char)pBuff & 1;
+- WorldBoolFlag = (BYTE)pBuff & 1;
 + WorldBoolFlag = (uintptr_t)pBuff & 1;
  xx_32 = 32;
  while (1) {
  yy_32 = 32;
-@@ -3186,7 +3186,7 @@ LABEL_11:
+@@ -3175,7 +3175,7 @@ LABEL_11:
  break;
  yy_32 -= width;
  if (dst < gpBufEnd) {
-- if (((unsigned char)dst & 1) == WorldBoolFlag) {
+- if (((BYTE)dst & 1) == WorldBoolFlag) {
 + if (((uintptr_t)dst & 1) == WorldBoolFlag) {
  chk_sh_and = width >> 1;
  if (!(width & 1))
  goto LABEL_280;
-@@ -4042,7 +4042,7 @@ void drawBottomArchesLowerScreen(BYTE *pBuff, unsigned
+@@ -4029,7 +4029,7 @@ void drawBottomArchesLowerScreen(BYTE *pBuff, DWORD *p
  }
  do {
  asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[xx_32 - 800];
+ dst = &dst[xx_32 - (SCREEN_WIDTH + 160)];
  xx_32 -= 2;
  } while (xx_32 >= 0);
-@@ -4096,7 +4096,7 @@ void drawBottomArchesLowerScreen(BYTE *pBuff, unsigned
+@@ -4083,7 +4083,7 @@ void drawBottomArchesLowerScreen(BYTE *pBuff, DWORD *p
  do {
  if (dst < gpBufEnd) {
  asm_trans_light_mask(32, tbl, &dst, &src, *gpDrawMask);
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
  } else {
  src += 32;
  dst += 32;
-@@ -4114,7 +4114,7 @@ void drawBottomArchesLowerScreen(BYTE *pBuff, unsigned
+@@ -4101,7 +4101,7 @@ void drawBottomArchesLowerScreen(BYTE *pBuff, DWORD *p
  }
  do {
  asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[xx_32 - 800];
+ dst = &dst[xx_32 - (SCREEN_WIDTH + 160)];
  xx_32 -= 2;
  } while (xx_32 >= 0);
-@@ -4396,7 +4396,7 @@ void drawBottomArchesLowerScreen(BYTE *pBuff, unsigned
+@@ -4383,7 +4383,7 @@ void drawBottomArchesLowerScreen(BYTE *pBuff, DWORD *p
  ++dst;
  --i;
  } while (i);
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
  } else {
  src += 32;
  dst += 32;
-@@ -4821,7 +4821,7 @@ void drawLowerScreen(BYTE *pBuff)
+@@ -4805,7 +4805,7 @@ void drawLowerScreen(BYTE *pBuff)
  }
  do {
  asm_cel_light_edge(32 - yy_32, tbl, &dst, &src);
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[yy_32 - 800];
+ dst = &dst[yy_32 - (SCREEN_WIDTH + 160)];
  yy_32 += 2;
  } while (yy_32 != 32);
-@@ -4834,7 +4834,7 @@ void drawLowerScreen(BYTE *pBuff)
+@@ -4818,7 +4818,7 @@ void drawLowerScreen(BYTE *pBuff)
  }
  do {
  asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[xx_32 - 800];
+ dst = &dst[xx_32 - (SCREEN_WIDTH + 160)];
  xx_32 -= 2;
  } while (xx_32 >= 0);
-@@ -4901,7 +4901,7 @@ void drawLowerScreen(BYTE *pBuff)
+@@ -4885,7 +4885,7 @@ void drawLowerScreen(BYTE *pBuff)
  }
  do {
  asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
-- src += (unsigned char)src & 2;
+- src += (BYTE)src & 2;
 + src += (uintptr_t)src & 2;
- dst = &dst[xx_32 - 800];
+ dst = &dst[xx_32 - (SCREEN_WIDTH + 160)];
  xx_32 -= 2;
  } while (xx_32 >= 0);
Index: patches/patch-defs_h
===================================================================
RCS file: /cvs/ports/games/devilutionx/patches/patch-defs_h,v
retrieving revision 1.1.1.1
diff -u -p -u -p -r1.1.1.1 patch-defs_h
--- patches/patch-defs_h 19 Jul 2019 13:42:33 -0000 1.1.1.1
+++ patches/patch-defs_h 24 Jul 2019 01:53:09 -0000
@@ -3,7 +3,7 @@ $OpenBSD: patch-defs_h,v 1.1.1.1 2019/07
 Index: defs.h
 --- defs.h.orig
 +++ defs.h
-@@ -151,7 +151,7 @@
+@@ -154,7 +154,7 @@
  // Typedef for the function pointer
  typedef void (*_PVFV)(void);
 

Reply | Threaded
Open this post in threaded view
|

Re: NEW: games/devilutionx

Nam Nguyen

I just realized that pasting it mangled the ^M. I have attached it
here. Also, the commit is dated July 23, 2019.

Nam Nguyen writes:

> amd64 multiplayer now works. Here is a diff for the git version as of
> July 19, 2019 from this commit
> (https://github.com/diasurgical/devilutionX/commit/72f65d577124d24ab9f459ef164e31c9ab225b3e).
>
> I added __LP64__ for amd64 specific bits, allowing it to compile on both
> amd64 and i386. Bryan suggested, "You could probably do #ifdef __i386__
> or __amd64__ or more generally, #ifdef __LP64__ I suspect there may be a
> way to fix it so the code works on both 32-bit and 64-bit platforms,
> however."
>
> To test I connected to a game hosted by Bryan, and we played the first
> several rooms in the first dungeon. Also, I was able to build and play
> from i386 and amd64 in the same game.
>
> Brian Callahan writes:
>> We'll sync with releases starting with the next release (presumable
>> 0.5).
>
> I have communicated my findings with upstream
> (https://github.com/diasurgical/devilutionX/issues/191). Multiplayer
> testing is a priority for the next release.
>
> This diff is pasted for consideration in ports, in case multiplayer is
> desired before the next release. Tests and feedback are welcome. Thank
> you to all involved in this port.
>
> Bryan Steele writes:
>
>> On Fri, Jul 19, 2019 at 10:37:59AM -0400, Bryan Steele wrote:
>>> On Thu, Jul 18, 2019 at 07:49:51PM -0400, Brian Callahan wrote:
>>> > Hi ports --
>>> >
>>> > Attached is a new port, games/devilutionx. DevilutionX is an open source
>>> > engine recreation for the original Diablo I game.
>>> >
>>> > ---
>>> > pkg/DESCR:
>>> > DevilutionX is an open source recreation of the game engine used in
>>> > Diablo I, an action role-playing game by Blizzard Entertainment.
>>> >
>>> > While this package and the game engine are open source, one still needs
>>> > to provide the original game assets from Diablo I, which is not open
>>> > source. You will need to purchase the original game to use this package.
>>> > ---
>>> >
>>> > This port is a multi-person effort between myself, thfr@, and brynet@. The
>>> > game works very well on amd64--the underlying engine is claimed to be nearly
>>> > 100% binary identical to the original game. Sadly, multiplayer doesn't work
>>> > on 64-bit platforms, but this is known and hopefully will be fixed at some
>>> > point.
>>> >
>>> > OK?
>>> >
>>> > ~Brian
>>>
>>> I'm obviously ok with this going in, w/ the pkg/README fix from Nam. :-)
>>>
>>> It's unfortunate that we will initially miss out on multiplayer support,
>>> but good that someone is working on the problem, and upstream is aware.
>>>
>>> Hopefully some of these changes can be sent upstream.
>>>
>>> -Bryan.
>>
>> To those of you following along, this is the port that thfr@ used when
>> streaming Diablo last month on OpenBSD.
>>
>> https://www.youtube.com/watch?v=5sBKaqkFev8


devilutionx.diff (23K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: NEW: games/devilutionx

Nam Nguyen

I promise that this third attachment preserves ^M properly. I had to use
application/octet-stream and not text/x-patch in my e-mail client.

Nam Nguyen writes:

> I just realized that pasting it mangled the ^M. I have attached it
> here. Also, the commit is dated July 23, 2019.


devilutionx.diff (31K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: NEW: games/devilutionx

Bryan Steele-2
I had a lot of fun testing this, indeed, this fixes multiplayer. I'm
ok with getting this in to make it easier for others to get in. :-)

On Tue, Jul 23, 2019 at 11:46:10PM -0700, Nam Nguyen wrote:
>
> I promise that this third attachment preserves ^M properly. I had to use
> application/octet-stream and not text/x-patch in my e-mail client.
>
> Nam Nguyen writes:
>
> > I just realized that pasting it mangled the ^M. I have attached it
> > here. Also, the commit is dated July 23, 2019.
>