From owner-svn-ports-all@freebsd.org Fri Jun 9 13:45:22 2017 Return-Path: Delivered-To: svn-ports-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 31A2CBF5112; Fri, 9 Jun 2017 13:45:22 +0000 (UTC) (envelope-from tobik@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id E73BE67D8D; Fri, 9 Jun 2017 13:45:21 +0000 (UTC) (envelope-from tobik@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v59DjLXM095557; Fri, 9 Jun 2017 13:45:21 GMT (envelope-from tobik@FreeBSD.org) Received: (from tobik@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v59DjKiw095548; Fri, 9 Jun 2017 13:45:20 GMT (envelope-from tobik@FreeBSD.org) Message-Id: <201706091345.v59DjKiw095548@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: tobik set sender to tobik@FreeBSD.org using -f From: Tobias Kortkamp Date: Fri, 9 Jun 2017 13:45:20 +0000 (UTC) To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r442987 - in head/games: . OpenTomb OpenTomb/files X-SVN-Group: ports-head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-ports-all@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: SVN commit messages for the ports tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 09 Jun 2017 13:45:22 -0000 Author: tobik Date: Fri Jun 9 13:45:20 2017 New Revision: 442987 URL: https://svnweb.freebsd.org/changeset/ports/442987 Log: New port: games/OpenTomb OpenTomb is an open-source engine reimplementation project intended to play levels from all classic-era Tomb Raider games (TR 1-5) and custom TRLE levels. The project does not use any old Tomb Raider source code, because all attempts to retrieve sources from Eidos / Core were in vain. WWW: https://opentomb.github.io/ PR: 218883 Submitted by: Piotr Kubaj Approved by: lme (mentor) Differential Revision: https://reviews.freebsd.org/D10664 Added: head/games/OpenTomb/ head/games/OpenTomb/Makefile (contents, props changed) head/games/OpenTomb/distinfo (contents, props changed) head/games/OpenTomb/files/ head/games/OpenTomb/files/OpenTomb.in (contents, props changed) head/games/OpenTomb/files/patch-src_world.cpp (contents, props changed) head/games/OpenTomb/pkg-descr (contents, props changed) head/games/OpenTomb/pkg-message (contents, props changed) head/games/OpenTomb/pkg-plist (contents, props changed) Modified: head/games/Makefile Modified: head/games/Makefile ============================================================================== --- head/games/Makefile Fri Jun 9 13:38:02 2017 (r442986) +++ head/games/Makefile Fri Jun 9 13:45:20 2017 (r442987) @@ -17,6 +17,7 @@ SUBDIR += CaribbeanStud SUBDIR += HeroesOfMightAndMagic SUBDIR += KnightCap + SUBDIR += OpenTomb SUBDIR += abbayedesmorts SUBDIR += abe SUBDIR += abuse_sdl Added: head/games/OpenTomb/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/games/OpenTomb/Makefile Fri Jun 9 13:45:20 2017 (r442987) @@ -0,0 +1,37 @@ +# Created by: Piotr Kubaj +# $FreeBSD$ + +PORTNAME= OpenTomb +DISTVERSIONPREFIX= win32- +DISTVERSION= 2017-04-24_alpha +CATEGORIES= games + +MAINTAINER= pkubaj@anongoth.pl +COMMENT= Open-source Tomb Raider 1-5 engine remake + +LICENSE= LGPL3 +LICENSE_FILE= ${WRKSRC}/LICENSE + +LIB_DEPENDS= libpng.so:graphics/png + +USE_GITHUB= yes + +USES= cmake lua openal +USE_SDL= sdl2 +SUB_FILES= OpenTomb + +post-patch: + @${REINPLACE_CMD} -e 's|%%PREFIX%%|${PREFIX}|g' ${WRKSRC}/src/render/shader_manager.cpp + @${REINPLACE_CMD} -e 's|%%PREFIX%%|${PREFIX}|g' ${WRKSRC}/scripts/entity/entity_functions.lua + @${REINPLACE_CMD} -e 's|%%PREFIX%%|${PREFIX}|g' ${WRKSRC}/scripts/trigger/trigger_functions.lua + +do-install: + @${MKDIR} ${STAGEDIR}${DATADIR} + ${INSTALL_PROGRAM} ${WRKSRC}/${PORTNAME} ${STAGEDIR}${DATADIR} + ${INSTALL_SCRIPT} ${WRKSRC}/autoexec.lua ${STAGEDIR}${DATADIR} + @cd ${WRKSRC}/scripts && ${COPYTREE_SHARE} . ${STAGEDIR}${DATADIR}/scripts "! -name *\.bak" + @cd ${WRKSRC}/shaders && ${COPYTREE_SHARE} . ${STAGEDIR}${DATADIR}/shaders + @cd ${WRKSRC}/resource && ${COPYTREE_SHARE} . ${STAGEDIR}${DATADIR}/resource + ${INSTALL_SCRIPT} ${WRKDIR}/${PORTNAME} ${STAGEDIR}${PREFIX}/bin + +.include Added: head/games/OpenTomb/distinfo ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/games/OpenTomb/distinfo Fri Jun 9 13:45:20 2017 (r442987) @@ -0,0 +1,3 @@ +TIMESTAMP = 1493300613 +SHA256 (OpenTomb-OpenTomb-win32-2017-04-24_alpha_GH0.tar.gz) = 48627b18f7d6f7a6675e66b12e26f6a4edbd1dbf4a0152eeca28eac86c9fd18d +SIZE (OpenTomb-OpenTomb-win32-2017-04-24_alpha_GH0.tar.gz) = 9268426 Added: head/games/OpenTomb/files/OpenTomb.in ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/games/OpenTomb/files/OpenTomb.in Fri Jun 9 13:45:20 2017 (r442987) @@ -0,0 +1,3 @@ +#!/bin/sh + +exec %%PREFIX%%/share/OpenTomb/OpenTomb -base_path %%PREFIX%%/share/OpenTomb -autoexec %%PREFIX%%/share/OpenTomb/autoexec.lua -config ~/.config.lua Added: head/games/OpenTomb/files/patch-src_world.cpp ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/games/OpenTomb/files/patch-src_world.cpp Fri Jun 9 13:45:20 2017 (r442987) @@ -0,0 +1,18 @@ +Fix compiling with libc++ and Clang + +src/world.cpp:689:53: error: no viable conversion from '__map_iterator<__tree_iterator<__value_type, class std::__1::__tree_node, void *> *, [...]>>' to '__map_iterator<__tree_iterator<__value_type, class std::__1::__tree_node, void + *> *, [...]>>' + std::map::iterator it = global_world.items_tree.find(item_id); + ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +--- src/world.cpp.orig 2017-04-23 13:39:54 UTC ++++ src/world.cpp +@@ -686,7 +686,7 @@ int World_CreateItem(uint32_t item_id, u + + int World_DeleteItem(uint32_t item_id) + { +- std::map::iterator it = global_world.items_tree.find(item_id); ++ std::map::iterator it = global_world.items_tree.find(item_id); + + if(it != global_world.items_tree.end()) + { Added: head/games/OpenTomb/pkg-descr ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/games/OpenTomb/pkg-descr Fri Jun 9 13:45:20 2017 (r442987) @@ -0,0 +1,7 @@ +OpenTomb is an open-source engine reimplementation project intended to +play levels from all classic-era Tomb Raider games (TR 1-5) and custom +TRLE levels. The project does not use any old Tomb Raider source +code, because all attempts to retrieve sources from Eidos / Core were +in vain. + +WWW: https://opentomb.github.io/ Added: head/games/OpenTomb/pkg-message ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/games/OpenTomb/pkg-message Fri Jun 9 13:45:20 2017 (r442987) @@ -0,0 +1,14 @@ +You need the following files to play OpenTomb: +* Data folders from each game. Get them from your retail game CDs or + Steam/GOG bundles. +* CD audio tracks. OpenTomb only supports OGG audiotracks for a + moment, so you should convert original soundtracks by yourself, or + just download whole TR1-5 music package here: + http://trep.trlevel.de/opentomb/files/tr_soundtracks_for_opentomb.zip + + PLEASE NOTE: script file bundled in this archive is outdated, so + don't overwrite existing soundtrack.lua file with one provided in + archive. +* Loading screens for TR1-3 and TR5. For TR3, get them from pix + directory of your installed official game. For other versions + download them from http://trep.trlevel.de/temp/loading_screens.zip Added: head/games/OpenTomb/pkg-plist ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/games/OpenTomb/pkg-plist Fri Jun 9 13:45:20 2017 (r442987) @@ -0,0 +1,212 @@ +bin/OpenTomb +%%DATADIR%%/OpenTomb +%%DATADIR%%/autoexec.lua +%%DATADIR%%/resource/fonts/DroidSansMono.ttf +%%DATADIR%%/resource/fonts/LICENSE +%%DATADIR%%/resource/fonts/Roboto-Regular.ttf +%%DATADIR%%/resource/fonts/RobotoCondensed-Regular.ttf +%%DATADIR%%/resource/fonts/VeraMoBd.ttf +%%DATADIR%%/resource/fonts/VeraMono.ttf +%%DATADIR%%/resource/fonts/Verdana.ttf +%%DATADIR%%/resource/graphics/legal.png +%%DATADIR%%/resource/icon/opentomb.ico +%%DATADIR%%/resource/icon/opentomb.rc +%%DATADIR%%/resource/mac/Images.xcassets/AppIcon.appiconset/Contents.json +%%DATADIR%%/resource/mac/Info.plist +%%DATADIR%%/scripts/audio/common_sounds.lua +%%DATADIR%%/scripts/audio/sample_override.lua +%%DATADIR%%/scripts/audio/soundtrack.lua +%%DATADIR%%/scripts/autoexec.lua +%%DATADIR%%/scripts/character/character.lua +%%DATADIR%%/scripts/character/hair.lua +%%DATADIR%%/scripts/character/ragdoll.lua +%%DATADIR%%/scripts/config/control_constants.lua +%%DATADIR%%/scripts/entity/entity_functions.lua +%%DATADIR%%/scripts/entity/entity_functions_common.lua +%%DATADIR%%/scripts/entity/entity_functions_enemies.lua +%%DATADIR%%/scripts/entity/entity_functions_platforms.lua +%%DATADIR%%/scripts/entity/entity_functions_switch.lua +%%DATADIR%%/scripts/entity/entity_functions_traps.lua +%%DATADIR%%/scripts/entity/entity_functions_unique.lua +%%DATADIR%%/scripts/entity/entity_model_ID_override.lua +%%DATADIR%%/scripts/entity/entity_properties.lua +%%DATADIR%%/scripts/gameflow/TR1.lua +%%DATADIR%%/scripts/gameflow/TR1_gold.lua +%%DATADIR%%/scripts/gameflow/TR2.lua +%%DATADIR%%/scripts/gameflow/TR2_gold.lua +%%DATADIR%%/scripts/gameflow/TR3.lua +%%DATADIR%%/scripts/gameflow/TR3_gold.lua +%%DATADIR%%/scripts/gameflow/TR4.lua +%%DATADIR%%/scripts/gameflow/TR5.lua +%%DATADIR%%/scripts/gameflow/gameflow.lua +%%DATADIR%%/scripts/gui/fonts.lua +%%DATADIR%%/scripts/inventory/item_combine.lua +%%DATADIR%%/scripts/inventory/item_list.lua +%%DATADIR%%/scripts/inventory/items.lua +%%DATADIR%%/scripts/level/tr1/CAT.lua +%%DATADIR%%/scripts/level/tr1/CUT1.lua +%%DATADIR%%/scripts/level/tr1/CUT2.lua +%%DATADIR%%/scripts/level/tr1/CUT3.lua +%%DATADIR%%/scripts/level/tr1/CUT4.lua +%%DATADIR%%/scripts/level/tr1/EGYPT.lua +%%DATADIR%%/scripts/level/tr1/END.lua +%%DATADIR%%/scripts/level/tr1/END2.lua +%%DATADIR%%/scripts/level/tr1/GYM.lua +%%DATADIR%%/scripts/level/tr1/LEVEL1.lua +%%DATADIR%%/scripts/level/tr1/LEVEL10A.lua +%%DATADIR%%/scripts/level/tr1/LEVEL10B.lua +%%DATADIR%%/scripts/level/tr1/LEVEL10C.lua +%%DATADIR%%/scripts/level/tr1/LEVEL2.lua +%%DATADIR%%/scripts/level/tr1/LEVEL3A.lua +%%DATADIR%%/scripts/level/tr1/LEVEL3B.lua +%%DATADIR%%/scripts/level/tr1/LEVEL4.lua +%%DATADIR%%/scripts/level/tr1/LEVEL5.lua +%%DATADIR%%/scripts/level/tr1/LEVEL6.lua +%%DATADIR%%/scripts/level/tr1/LEVEL7A.lua +%%DATADIR%%/scripts/level/tr1/LEVEL7B.lua +%%DATADIR%%/scripts/level/tr1/LEVEL8A.lua +%%DATADIR%%/scripts/level/tr1/LEVEL8B.lua +%%DATADIR%%/scripts/level/tr1/LEVEL8C.lua +%%DATADIR%%/scripts/level/tr1/TITLE.lua +%%DATADIR%%/scripts/level/tr2/ASSAULT.lua +%%DATADIR%%/scripts/level/tr2/BOAT.lua +%%DATADIR%%/scripts/level/tr2/CATACOMB.lua +%%DATADIR%%/scripts/level/tr2/CUT1.lua +%%DATADIR%%/scripts/level/tr2/CUT2.lua +%%DATADIR%%/scripts/level/tr2/CUT3.lua +%%DATADIR%%/scripts/level/tr2/CUT4.lua +%%DATADIR%%/scripts/level/tr2/DECK.lua +%%DATADIR%%/scripts/level/tr2/EMPRTOMB.lua +%%DATADIR%%/scripts/level/tr2/FLOATING.lua +%%DATADIR%%/scripts/level/tr2/HOUSE.lua +%%DATADIR%%/scripts/level/tr2/ICECAVE.lua +%%DATADIR%%/scripts/level/tr2/KEEL.lua +%%DATADIR%%/scripts/level/tr2/LEVEL1.lua +%%DATADIR%%/scripts/level/tr2/LEVEL2.lua +%%DATADIR%%/scripts/level/tr2/LEVEL3.lua +%%DATADIR%%/scripts/level/tr2/LEVEL4.lua +%%DATADIR%%/scripts/level/tr2/LEVEL5.lua +%%DATADIR%%/scripts/level/tr2/LIVING.lua +%%DATADIR%%/scripts/level/tr2/MONASTRY.lua +%%DATADIR%%/scripts/level/tr2/OPERA.lua +%%DATADIR%%/scripts/level/tr2/PLATFORM.lua +%%DATADIR%%/scripts/level/tr2/RIG.lua +%%DATADIR%%/scripts/level/tr2/SKIDOO.lua +%%DATADIR%%/scripts/level/tr2/TITLE.lua +%%DATADIR%%/scripts/level/tr2/UNWATER.lua +%%DATADIR%%/scripts/level/tr2/VENICE.lua +%%DATADIR%%/scripts/level/tr2/WALL.lua +%%DATADIR%%/scripts/level/tr2/XIAN.lua +%%DATADIR%%/scripts/level/tr3/ANTARC.lua +%%DATADIR%%/scripts/level/tr3/AREA51.lua +%%DATADIR%%/scripts/level/tr3/CHAMBER.lua +%%DATADIR%%/scripts/level/tr3/CHUNNEL.lua +%%DATADIR%%/scripts/level/tr3/CITY.lua +%%DATADIR%%/scripts/level/tr3/COMPOUND.lua +%%DATADIR%%/scripts/level/tr3/CRASH.lua +%%DATADIR%%/scripts/level/tr3/HOUSE.lua +%%DATADIR%%/scripts/level/tr3/JUNGLE.lua +%%DATADIR%%/scripts/level/tr3/MINES.lua +%%DATADIR%%/scripts/level/tr3/NEVADA.lua +%%DATADIR%%/scripts/level/tr3/OFFICE.lua +%%DATADIR%%/scripts/level/tr3/QUADCHAS.lua +%%DATADIR%%/scripts/level/tr3/RAPIDS.lua +%%DATADIR%%/scripts/level/tr3/ROOFS.lua +%%DATADIR%%/scripts/level/tr3/SCOTLAND.lua +%%DATADIR%%/scripts/level/tr3/SEWER.lua +%%DATADIR%%/scripts/level/tr3/SHORE.lua +%%DATADIR%%/scripts/level/tr3/SLINC.lua +%%DATADIR%%/scripts/level/tr3/STPAUL.lua +%%DATADIR%%/scripts/level/tr3/TEMPLE.lua +%%DATADIR%%/scripts/level/tr3/TITLE.lua +%%DATADIR%%/scripts/level/tr3/TONYBOSS.lua +%%DATADIR%%/scripts/level/tr3/TOWER.lua +%%DATADIR%%/scripts/level/tr3/TRIBOSS.lua +%%DATADIR%%/scripts/level/tr3/TRTLA.lua +%%DATADIR%%/scripts/level/tr3/UNDERSEA.lua +%%DATADIR%%/scripts/level/tr3/VICT.lua +%%DATADIR%%/scripts/level/tr3/WILLSDEN.lua +%%DATADIR%%/scripts/level/tr3/ZOO.lua +%%DATADIR%%/scripts/level/tr4/ALEXHUB.lua +%%DATADIR%%/scripts/level/tr4/ALEXHUB2.lua +%%DATADIR%%/scripts/level/tr4/ANGKOR1.lua +%%DATADIR%%/scripts/level/tr4/ANG_RACE.lua +%%DATADIR%%/scripts/level/tr4/BIKEBIT.lua +%%DATADIR%%/scripts/level/tr4/CITNEW.lua +%%DATADIR%%/scripts/level/tr4/CORTYARD.lua +%%DATADIR%%/scripts/level/tr4/CSPLIT1.lua +%%DATADIR%%/scripts/level/tr4/CSPLIT2.lua +%%DATADIR%%/scripts/level/tr4/HALL.lua +%%DATADIR%%/scripts/level/tr4/HIGHSTRT.lua +%%DATADIR%%/scripts/level/tr4/JEEPCHAS.lua +%%DATADIR%%/scripts/level/tr4/JEEPCHS2.lua +%%DATADIR%%/scripts/level/tr4/JOBY1A.lua +%%DATADIR%%/scripts/level/tr4/JOBY1B.lua +%%DATADIR%%/scripts/level/tr4/JOBY2.lua +%%DATADIR%%/scripts/level/tr4/JOBY3A.lua +%%DATADIR%%/scripts/level/tr4/JOBY3B.lua +%%DATADIR%%/scripts/level/tr4/JOBY4A.lua +%%DATADIR%%/scripts/level/tr4/JOBY4B.lua +%%DATADIR%%/scripts/level/tr4/JOBY4C.lua +%%DATADIR%%/scripts/level/tr4/JOBY5A.lua +%%DATADIR%%/scripts/level/tr4/JOBY5B.lua +%%DATADIR%%/scripts/level/tr4/JOBY5C.lua +%%DATADIR%%/scripts/level/tr4/KARNAK1.lua +%%DATADIR%%/scripts/level/tr4/LAKE.lua +%%DATADIR%%/scripts/level/tr4/LIBEND.lua +%%DATADIR%%/scripts/level/tr4/LIBRARY.lua +%%DATADIR%%/scripts/level/tr4/LOWSTRT.lua +%%DATADIR%%/scripts/level/tr4/NUTRENCH.lua +%%DATADIR%%/scripts/level/tr4/PALACES.lua +%%DATADIR%%/scripts/level/tr4/PALACES2.lua +%%DATADIR%%/scripts/level/tr4/SEMER.lua +%%DATADIR%%/scripts/level/tr4/SEMER2.lua +%%DATADIR%%/scripts/level/tr4/SETTOMB1.lua +%%DATADIR%%/scripts/level/tr4/SETTOMB2.lua +%%DATADIR%%/scripts/level/tr4/TITLE.lua +%%DATADIR%%/scripts/level/tr4/TRAIN.lua +%%DATADIR%%/scripts/level/tr5/ANDREA1.lua +%%DATADIR%%/scripts/level/tr5/ANDREA2.lua +%%DATADIR%%/scripts/level/tr5/ANDREA3.lua +%%DATADIR%%/scripts/level/tr5/ANDY1.lua +%%DATADIR%%/scripts/level/tr5/ANDY2.lua +%%DATADIR%%/scripts/level/tr5/ANDY3.lua +%%DATADIR%%/scripts/level/tr5/DEL.lua +%%DATADIR%%/scripts/level/tr5/JOBY2.lua +%%DATADIR%%/scripts/level/tr5/JOBY3.lua +%%DATADIR%%/scripts/level/tr5/JOBY4.lua +%%DATADIR%%/scripts/level/tr5/JOBY5.lua +%%DATADIR%%/scripts/level/tr5/RICH1.lua +%%DATADIR%%/scripts/level/tr5/RICH2.lua +%%DATADIR%%/scripts/level/tr5/RICH3.lua +%%DATADIR%%/scripts/level/tr5/RICHCUT2.lua +%%DATADIR%%/scripts/level/tr5/TITLE.lua +%%DATADIR%%/scripts/level_preload.lua +%%DATADIR%%/scripts/loadscript.lua +%%DATADIR%%/scripts/strings/english/generic.lua +%%DATADIR%%/scripts/strings/english/global_items.lua +%%DATADIR%%/scripts/strings/english/sys_notify.lua +%%DATADIR%%/scripts/strings/french/generic.lua +%%DATADIR%%/scripts/strings/french/global_items.lua +%%DATADIR%%/scripts/strings/french/sys_notify.lua +%%DATADIR%%/scripts/strings/getstring.lua +%%DATADIR%%/scripts/strings/italian/generic.lua +%%DATADIR%%/scripts/strings/italian/global_items.lua +%%DATADIR%%/scripts/strings/russian/generic.lua +%%DATADIR%%/scripts/strings/russian/global_items.lua +%%DATADIR%%/scripts/strings/russian/sys_notify.lua +%%DATADIR%%/scripts/strings/spanish/generic.lua +%%DATADIR%%/scripts/strings/spanish/global_items.lua +%%DATADIR%%/scripts/system/debug.lua +%%DATADIR%%/scripts/system/sys_scripts.lua +%%DATADIR%%/scripts/trigger/flipeffects.lua +%%DATADIR%%/scripts/trigger/helper_functions.lua +%%DATADIR%%/scripts/trigger/trigger_functions.lua +%%DATADIR%%/shaders/entity.fsh +%%DATADIR%%/shaders/entity.vsh +%%DATADIR%%/shaders/room.fsh +%%DATADIR%%/shaders/room.vsh +%%DATADIR%%/shaders/static_mesh.fsh +%%DATADIR%%/shaders/static_mesh.vsh +%%DATADIR%%/shaders/text.fsh +%%DATADIR%%/shaders/text.vsh